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

10

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) geram 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?

    
por qdii 16.10.2012 / 02:43

2 respostas

19

O tipo char em C é um byte, mas é destinado a caracteres ASCII; existem codificações de largura variável como UTF-8, que podem ocupar muitos bytes por caractere. wc usa a função mbrtowc(3) para decodificar sequências multibyte, dependendo da localidade definida pela variável de ambiente LC_CTYPE . Se você definir a localidade 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
    
por 16.10.2012 / 02:59
14

Com um palpite,

  1. Sua localidade usa a codificação UTF-8 e

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

A propósito, de man wc :

   -c, --bytes
          print the byte counts

   -m, --chars
          print the character counts
    
por 16.10.2012 / 02:57