Por que wc -m e wc -c são diferentes?

12

Como programador C, fiquei surpreso ao ver que wc -c(que conta o número de bytes) e wc -m(que conta o número de caracteres) produz resultados muito diferentes para um longo arquivo de texto meu. Sempre me disseram que sizeof(char)é 1 byte.

qdii@nomada ~/Documents $ wc -c sentences.csv
102990983 sentences.csv
qdii@nomada ~/Documents $ wc -m sentences.csv
89023123 sentences.csv

Alguma explicação?

qdii
fonte
Veja a resposta de @ rici abaixo ... você tem os sinalizadores -m e -c na sua pergunta (c = bytes, m = caracteres) ... mas o exemplo de saída está correto.
Dan

Respostas:

20

O chartipo em C é de um byte, mas é destinado a caracteres ASCII; existem codificações de largura variável, como UTF-8, que podem ocupar muitos bytes por caractere. wcusa a mbrtowc(3)função para decodificar seqüências multibyte, dependendo do código de idioma definido pela LC_CTYPEvariável de ambiente. Se você definir o código do idioma corretamente, deverá obter o mesmo resultado para todos os casos. Por exemplo:

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

Em um palpite,

  1. Seu código de idioma usa codificação UTF-8 e

  2. Aproximadamente 10% do seu arquivo consiste em caracteres que requerem mais de um octeto para codificar no UTF-8.

A propósito, de man wc:

   -c, --bytes
          print the byte counts

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