Pourquoi wc -m et wc -c sont-ils différents?

12

En tant que programmeur C, j'ai été surpris de voir que wc -c(qui compte le nombre d'octets) et wc -m(qui compte le nombre de caractères) produisaient des résultats très différents pour un long fichier texte. On m'avait toujours dit que c'était sizeof(char)1 octet.

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

Une explication?

qdii
la source
Voir la réponse de @ rici ci-dessous ... vous avez vos indicateurs -m et -c en arrière dans votre question (c = octets, m = caractères) ... votre sortie d'exemple est correcte, cependant.
Dan

Réponses:

20

Le chartype en C est d'un octet, mais il est destiné aux caractères ASCII; il existe des encodages à largeur variable comme UTF-8 qui peuvent prendre plusieurs octets par caractère. wcutilise la mbrtowc(3)fonction pour décoder les séquences multi-octets, en fonction des paramètres régionaux définis par la LC_CTYPEvariable d'environnement. Si vous définissez les paramètres régionaux correctement, vous devriez obtenir le même résultat pour tous les cas. Par exemple:

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

À une supposition,

  1. Vos paramètres régionaux utilisent le codage UTF-8, et

  2. Environ 10% de votre fichier se compose de caractères qui nécessitent plus d'un octet pour être codés en UTF-8.

Soit dit en passant, de man wc:

   -c, --bytes
          print the byte counts

   -m, --chars
          print the character counts
rici
la source