Почему wc -m и wc -c разные?

12

Как программист на Си, я был удивлен, увидев, что 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

Любое объяснение?

QDII
источник
Посмотрите ответ @ rici ниже ... у вас есть флаги -m и -c в вашем вопросе (c = байты, m = символы) ... ваш пример вывода верен.
Дан

Ответы:

20

charТипа в C является один байт, но он предназначен для ASCII символов; Существуют кодировки переменной ширины, такие как UTF-8, которые могут занимать много байтов на символ. 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
RICi
источник