Tại sao wc -m và wc -c khác nhau?


12

Là một lập trình viên C, tôi rất ngạc nhiên khi thấy rằng wc -c(tính số byte) và wc -m(tính số lượng ký tự) cho kết quả rất khác nhau đối với một tệp văn bản dài của tôi. Tôi đã luôn luôn nói rằng đó sizeof(char)là 1 byte.

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

Có lời giải thích nào không?


Xem câu trả lời của @ rici bên dưới ... mặc dù bạn đã có các cờ -m và -c của bạn ngược lại trong câu hỏi của bạn (c = byte, m = ký tự) ... tuy nhiên đầu ra ví dụ của bạn là chính xác.
Dan

Câu trả lời:


20

Các charloại trong C là một byte, nhưng nó dành cho các ký tự ASCII; có các bảng mã có độ rộng thay đổi như UTF-8 có thể chiếm nhiều byte trên mỗi ký tự. wcsử dụng mbrtowc(3)hàm để giải mã các chuỗi đa bào, tùy thuộc vào miền địa phương được đặt bởi LC_CTYPEbiến môi trường. Nếu bạn đặt ngôn ngữ chính xác, bạn sẽ nhận được kết quả tương tự cho tất cả các trường hợp. Ví dụ:

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

16

Đoán,

  1. Ngôn ngữ của bạn sử dụng mã hóa UTF-8 và

  2. Khoảng 10% tệp của bạn bao gồm các ký tự yêu cầu nhiều hơn một octet để mã hóa thành UTF-8.

Nhân tiện, từ man wc:

   -c, --bytes
          print the byte counts

   -m, --chars
          print the character counts
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.