Mengapa wc -m dan wc -c berbeda?

12

Sebagai seorang programmer C, saya terkejut melihat bahwa wc -c(yang menghitung jumlah byte), dan wc -m(yang menghitung jumlah karakter) menghasilkan hasil yang sangat berbeda untuk file teks saya yang panjang. Saya selalu diberi tahu bahwa itu sizeof(char)adalah 1 byte.

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

Ada penjelasan?

qdii
sumber
Lihat jawaban @ rici di bawah ini ... Anda mendapatkan flag -m dan -c di pertanyaan Anda (c = bytes, m = karakter) ... contoh output Anda sudah benar.
Dan

Jawaban:

20

The charketik C adalah salah satu byte, tapi itu dimaksudkan untuk karakter ASCII; ada penyandian lebar variabel seperti UTF-8 yang dapat mengambil banyak byte per karakter. wcmenggunakan mbrtowc(3)fungsi untuk memecahkan kode urutan multibyte, tergantung pada lokal yang ditetapkan oleh LC_CTYPEvariabel lingkungan. Jika Anda mengatur lokal dengan benar, Anda harus mendapatkan hasil yang sama untuk semua kasus. Sebagai contoh:

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

Pada tebakan,

  1. Lokal Anda menggunakan pengkodean UTF-8, dan

  2. Sekitar 10% dari file Anda terdiri dari karakter yang membutuhkan lebih dari satu oktet untuk dikodekan ke dalam UTF-8.

Ngomong-ngomong, dari man wc:

   -c, --bytes
          print the byte counts

   -m, --chars
          print the character counts
rici
sumber