Dlaczego wc -m i wc -c są różne?


12

Jako programista języka C zdziwiłem się, widząc, że wc -c(która liczy liczbę bajtów) i wc -m(która liczy liczbę znaków) generują bardzo różne wyniki dla mojego długiego pliku tekstowego. Zawsze mi mówiono, że sizeof(char)to 1 bajt.

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

Jakieś wyjaśnienie?


Zobacz odpowiedź @ rici poniżej ... masz w swoim pytaniu flagi -m i -c (c = bajty, m = znaki) ... ale twoje przykładowe dane wyjściowe są poprawne.
Dan

Odpowiedzi:


20

charTyp w C jest jeden bajt, ale jest przeznaczony dla znaków ASCII; istnieją kodowania o zmiennej szerokości, takie jak UTF-8, które mogą zajmować wiele bajtów na znak. wcużywa mbrtowc(3)funkcji do dekodowania sekwencji wielobajtowych, w zależności od ustawień regionalnych określonych przez LC_CTYPEzmienną środowiskową. Jeśli poprawnie ustawisz ustawienia regionalne, powinieneś uzyskać taki sam wynik we wszystkich przypadkach. Na przykład:

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

16

Zgaduję

  1. Twoje ustawienia regionalne używają kodowania UTF-8 i

  2. Około 10% twojego pliku składa się ze znaków, które wymagają więcej niż jednego oktetu do zakodowania w UTF-8.

Nawiasem mówiąc, z man wc:

   -c, --bytes
          print the byte counts

   -m, --chars
          print the character counts
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.