왜 wc -m과 wc -c가 다른가? 출력 한다는 사실에 놀랐습니다

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

어떤 설명?



답변

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

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

답변

한마디로

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

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

그건 그렇고,에서 man wc:

   -c, --bytes
          print the byte counts

   -m, --chars
          print the character counts