Character-Encoding
為什麼 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
有什麼解釋嗎?
C 中的
char
類型是一個字節,但它是為 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 的字元。
順便說一句,來自
man wc
:-c, --bytes print the byte counts -m, --chars print the character counts