왜 wc -m과 wc -c가 다른가?


12

C 프로그래머로서, 나는 wc -c바이트 수 wc -m를 세고 문자 수를 세는 것이 긴 텍스트 파일에 대해 매우 다른 결과를 출력 한다는 사실에 놀랐습니다 . 나는 항상 sizeof(char)1 바이트 라고 들었습니다 .

qdii@nomada ~/Documents $ wc -c sentences.csv
102990983 sentences.csv
qdii@nomada ~/Documents $ wc -m sentences.csv
89023123 sentences.csv

어떤 설명?


아래의 @ rici 's answer를 참조하십시오 ... 당신의 질문에 -m 및 -c 플래그가 거꾸로 있습니다 (c = bytes, m = characters) ...하지만 예제 출력은 정확합니다.
Dan

답변:


20

charC 의 유형은 1 바이트이지만 ASCII 문자 용입니다. 가 가변 폭 인코딩 UTF-8 문자 당 바이트를 취할 수 등. 환경 변수에 의해 설정된 로케일에 따라 함수를 wc사용하여 mbrtowc(3)멀티 바이트 시퀀스를 디코딩 LC_CTYPE합니다. 로케일을 올바르게 설정하면 모든 경우에 동일한 결과가 나타납니다. 예를 들면 다음과 같습니다.

qdii@nomada ~/Documents $ LC_CTYPE="C" wc -m sentences.csv
102990983 sentences.csv

16

한마디로

  1. 로케일은 UTF-8 인코딩을 사용하며

  2. 파일의 약 10 %는 UTF-8로 인코딩하기 위해 둘 이상의 8 진수가 필요한 문자로 구성됩니다.

그건 그렇고,에서 man wc:

   -c, --bytes
          print the byte counts

   -m, --chars
          print the character counts
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.