Как программист на Си, я был удивлен, увидев, что 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
Любое объяснение?
Ответы:
char
Типа в C является один байт, но он предназначен для ASCII символов; Существуют кодировки переменной ширины, такие как UTF-8, которые могут занимать много байтов на символ.wc
используетmbrtowc(3)
функцию для декодирования многобайтовых последовательностей в зависимости от локали, установленнойLC_CTYPE
переменной окружения. Если вы правильно установите локаль, вы должны получить одинаковый результат для всех случаев. Например:источник
На предположение,
Ваш язык использует кодировку UTF-8 и
Около 10% вашего файла состоит из символов, для кодирования которых требуется более одного октета в UTF-8.
Кстати, из
man wc
:источник