web-dev-qa-db-ja.com

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
_

説明はありますか?

12
qdii

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

_qdii@nomada ~/Documents $ LC_CTYPE="C" wc -m sentences.csv
102990983 sentences.csv
_
20
Michael Mrozek

推測で、

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

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

ところで、man wcから:

   -c, --bytes
          print the byte counts

   -m, --chars
          print the character counts
16
rici