¿Por qué wc -m y wc -c son diferentes?

12

Como programador en C, me sorprendió ver que wc -c(que cuenta la cantidad de bytes) y wc -m(que cuenta la cantidad de caracteres) genera resultados muy diferentes para un archivo de texto largo mío. Siempre me dijeron que sizeof(char)es 1 byte.

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

Alguna explicación?

qdii
fuente
Vea la respuesta de @ rici a continuación ... tiene sus indicadores -m y -c al revés en su pregunta (c = bytes, m = caracteres) ... sin embargo, su salida de ejemplo es correcta.
Dan

Respuestas:

20

El chartipo en C es un byte, pero está destinado a caracteres ASCII; Existen codificaciones de ancho variable como UTF-8 que pueden ocupar muchos bytes por carácter. wcusa la mbrtowc(3)función para decodificar secuencias multibyte, dependiendo de la configuración regional establecida por la LC_CTYPEvariable de entorno. Si configura la configuración regional correctamente, debería obtener el mismo resultado para todos los casos. Por ejemplo:

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

En una suposición,

  1. Su entorno local utiliza codificación UTF-8 y

  2. Alrededor del 10% de su archivo consta de caracteres que requieren más de un octeto para codificar en UTF-8.

Por cierto, de man wc:

   -c, --bytes
          print the byte counts

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