qdi*_*dii 15 character-encoding locale wc
作为一名 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
Run Code Online (Sandbox Code Playgroud)
有什么解释吗?
Mic*_*zek 22
char
C 中的类型是一个字节,但它用于 ASCII 字符;有像 UTF-8 这样的可变宽度编码,每个字符可以占用很多字节。wc
使用该mbrtowc(3)
函数解码多字节序列,具体取决于LC_CTYPE
环境变量设置的区域设置。如果您正确设置了语言环境,您应该在所有情况下都获得相同的结果。例如:
qdii@nomada ~/Documents $ LC_CTYPE="C" wc -m sentences.csv
102990983 sentences.csv
Run Code Online (Sandbox Code Playgroud)
ric*_*ici 16
据推测,
您的语言环境使用 UTF-8 编码,并且
大约 10% 的文件包含需要多个八位字节才能编码为 UTF-8 的字符。
顺便说一下,从man wc
:
-c, --bytes
print the byte counts
-m, --chars
print the character counts
Run Code Online (Sandbox Code Playgroud)