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?
Réponses:
Le
char
type 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.wc
utilise lambrtowc(3)
fonction pour décoder les séquences multi-octets, en fonction des paramètres régionaux définis par laLC_CTYPE
variable 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:la source
À une supposition,
Vos paramètres régionaux utilisent le codage UTF-8, et
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
:la source