なぜwc -mとwc -cが異なるのですか?


12

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

説明はありますか?


下記の@riciの回答を参照してください...質問に-mフラグと-cフラグが逆方向にあります(c =バイト、m =文字)...ただし、出力例は正しいです。
ダン

回答:


20

charC のタイプは1バイトですが、ASCII文字用です。UTF-8のような可変幅のエンコーディングがあり、1文字あたりのバイト数が多くなる可能性があります。環境変数で設定されたロケールに応じwcて、mbrtowc(3)関数を使用してマルチバイトシーケンスをデコードしLC_CTYPEます。ロケールを適切に設定すると、すべてのケースで同じ結果が得られるはずです。例えば:

qdii@nomada ~/Documents $ LC_CTYPE="C" wc -m sentences.csv
102990983 sentences.csv

16

推測で、

  1. ロケールがUTF-8エンコーディングを使用している。

  2. ファイルの約10%は、UTF-8にエンコードするために複数のオクテットを必要とする文字で構成されています。

ちなみに、からman wc

   -c, --bytes
          print the byte counts

   -m, --chars
          print the character counts
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.