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?
character-encoding
locale
wc
qdii
źródło
źródło
Odpowiedzi:
char
Typ 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.wc
używambrtowc(3)
funkcji do dekodowania sekwencji wielobajtowych, w zależności od ustawień regionalnych określonych przezLC_CTYPE
zmienną środowiskową. Jeśli poprawnie ustawisz ustawienia regionalne, powinieneś uzyskać taki sam wynik we wszystkich przypadkach. Na przykład:źródło
Zgaduję
Twoje ustawienia regionalne używają kodowania UTF-8 i
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
:źródło