ทำไม wc -m และ wc -c ต่างกัน?


12

ในฐานะโปรแกรมเมอร์ C ฉันรู้สึกประหลาดใจที่เห็นว่าwc -c(ซึ่งนับจำนวนไบต์) และwc -m(ซึ่งนับจำนวนอักขระ) ผลลัพธ์ผลลัพธ์ที่แตกต่างกันมากสำหรับไฟล์ข้อความขนาดยาวของฉัน ฉันได้รับการบอกเสมอว่าsizeof(char)มี 1 ไบต์

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

คำอธิบายใด ๆ


ดูคำตอบของ @ rici ด้านล่าง ... คุณมีแฟล็ก -m และ -c ของคุณย้อนกลับในคำถามของคุณ (c = bytes, m = ตัวอักษร) ... ผลลัพธ์ตัวอย่างของคุณถูกต้องแล้ว
ด่าน

คำตอบ:


20

charพิมพ์ในซีเป็นหนึ่งไบต์ แต่มันมีไว้สำหรับอักขระ ASCII; มีการเข้ารหัสความกว้างของตัวแปรเช่น UTF-8 ที่สามารถรับได้หลายไบต์ต่อตัวอักษร wcใช้mbrtowc(3)ฟังก์ชันเพื่อถอดรหัสลำดับหลายไบต์ขึ้นอยู่กับสถานที่ตั้งโดยLC_CTYPEตัวแปรสภาพแวดล้อม หากคุณตั้งค่าภาษาให้ถูกต้องคุณควรได้ผลลัพธ์เดียวกันทุกกรณี ตัวอย่างเช่น:

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

16

เดาสิ

  1. โลแคลของคุณใช้การเข้ารหัส UTF-8 และ

  2. ประมาณ 10% ของไฟล์ของคุณประกอบด้วยอักขระที่ต้องใช้อ็อกเท็ตมากกว่าหนึ่งตัวในการเข้ารหัสเป็น UTF-8

โดยวิธีการจากman wc:

   -c, --bytes
          print the byte counts

   -m, --chars
          print the character counts
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.