为什么 wc -m 和 wc -c 不同?

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

charC 中的类型是一个字节,但它用于 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

据推测,

  1. 您的语言环境使用 UTF-8 编码,并且

  2. 大约 10% 的文件包含需要多个八位字节才能编码为 UTF-8 的字符。

顺便说一下,从man wc

   -c, --bytes
          print the byte counts

   -m, --chars
          print the character counts
Run Code Online (Sandbox Code Playgroud)