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
型は1バイトですが、ASCII文字です。UTF-8のように 可変幅エンコーディング を使用できます) wc
は、_LC_CTYPE
_環境変数で設定されたロケールに応じて、mbrtowc(3)
関数を使用してマルチバイトシーケンスをデコードします。ロケールを適切に設定すると、すべてのケースで同じ結果が得られるはずです。次に例を示します。
_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