Perché wc -m e wc -c sono diversi?


12

Come programmatore C, sono stato sorpreso di vedere che wc -c(che conta il numero di byte) e wc -m(che conta il numero di caratteri) ha prodotto risultati molto diversi per un mio lungo file di testo. Mi è sempre stato detto che sizeof(char)è 1 byte.

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

Alcuna spiegazione?


Vedi la risposta di @ rici sotto ... hai i tuoi flag -m e -c all'indietro nella tua domanda (c = byte, m = caratteri) ... il tuo esempio di output è corretto, però.
Dan,

Risposte:


20

Il chartipo in C è un byte, ma è destinato ai caratteri ASCII; ci sono codifiche a larghezza variabile come UTF-8 che possono occupare molti byte per carattere. wcutilizza la mbrtowc(3)funzione per decodificare sequenze multibyte, a seconda della locale impostata dalla LC_CTYPEvariabile d'ambiente. Se imposti correttamente le impostazioni internazionali, dovresti ottenere lo stesso risultato per tutti i casi. Per esempio:

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

16

A indovinare,

  1. La tua locale usa la codifica UTF-8 e

  2. Circa il 10% del file è costituito da caratteri che richiedono più di un ottetto per codificare in UTF-8.

A proposito, da man wc:

   -c, --bytes
          print the byte counts

   -m, --chars
          print the character counts
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.