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
어떤 설명?
답변
char
C 의 유형은 1 바이트이지만 ASCII 문자 용입니다. 가 가변 폭 인코딩 UTF-8 문자 당 바이트를 취할 수 등. 환경 변수에 의해 설정된 로케일에 따라 함수를 wc
사용하여 mbrtowc(3)
멀티 바이트 시퀀스를 디코딩 LC_CTYPE
합니다. 로케일을 올바르게 설정하면 모든 경우에 동일한 결과가 나타납니다. 예를 들면 다음과 같습니다.
qdii@nomada ~/Documents $ LC_CTYPE="C" wc -m sentences.csv
102990983 sentences.csv
답변
한마디로
-
로케일은 UTF-8 인코딩을 사용하며
-
파일의 약 10 %는 UTF-8로 인코딩하기 위해 둘 이상의 8 진수가 필요한 문자로 구성됩니다.
그건 그렇고,에서 man wc
:
-c, --bytes
print the byte counts
-m, --chars
print the character counts