Чому 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

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.