Warum unterscheiden sich wc -m und wc -c?


12

Als C-Programmierer war ich überrascht zu sehen, dass wc -c(die die Anzahl der Bytes zählen) und wc -m(die die Anzahl der Zeichen zählt) sehr unterschiedliche Ergebnisse für eine lange Textdatei von mir ausgegeben werden. Mir wurde immer gesagt, dass dies sizeof(char)1 Byte ist.

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

Irgendeine Erklärung?


Siehe die Antwort von @ rici unten ... Sie haben Ihre Flags -m und -c in Ihrer Frage rückwärts (c = Bytes, m = Zeichen) ... Ihre Beispielausgabe ist jedoch korrekt.
Dan

Antworten:


20

Der charTyp in C ist ein Byte, aber für ASCII-Zeichen vorgesehen. Es gibt Codierungen mit variabler Breite wie UTF-8, die viele Bytes pro Zeichen belegen können. wcVerwendet die mbrtowc(3)Funktion zum Dekodieren von Multibyte-Sequenzen, abhängig vom Gebietsschema, das von der LC_CTYPEUmgebungsvariablen festgelegt wird. Wenn Sie das Gebietsschema richtig eingestellt haben, sollten Sie in allen Fällen das gleiche Ergebnis erhalten. Beispielsweise:

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

16

Auf eine Vermutung,

  1. Ihr Gebietsschema verwendet die UTF-8-Codierung und

  2. Ungefähr 10% Ihrer Datei besteht aus Zeichen, für deren Codierung in UTF-8 mehr als ein Oktett erforderlich ist.

Übrigens von man wc:

   -c, --bytes
          print the byte counts

   -m, --chars
          print the character counts
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.