Character-Encoding

為什麼 wc -m 和 wc -c 不同?

  • July 11, 2021

作為一名 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

猜測一下,

  1. 您的語言環境使用 UTF-8 編碼,並且
  2. 大約 10% 的文件包含需要多個八位字節才能編碼為 UTF-8 的字元。

順便說一句,來自man wc

  -c, --bytes
         print the byte counts

  -m, --chars
         print the character counts

引用自:https://unix.stackexchange.com/questions/51945