$ locale charmap
UTF-8
ในสภาพแวดล้อมปัจจุบันของฉันชุดอักขระคือ UTF-8 นั่นคืออักขระถูกเข้ารหัสด้วย 1 ถึง 4 ไบต์ต่ออักขระ (แม้ว่าเนื่องจากนิยามดั้งเดิมของ UTF-8 อนุญาตให้ใช้รหัสอักขระได้ถึง 0x7fffffff เครื่องมือส่วนใหญ่จะรู้จัก UTF- ลำดับ 8 ไบต์สูงสุด 6 ไบต์)
ในชุดอักขระนั้นอักขระทั้งหมดจาก Unicode จะพร้อมใช้งาน a a
จะถูกเข้ารหัสเป็นค่าไบต์ 65 乕
เป็น 3 ไบต์ 228 185 149 และé
เป็นลำดับสองไบต์ 195 169 เป็นต้น
$ printf 乕 | wc -mc
1 3
$ printf a | wc -mc
1 1
ขณะนี้:
$ export fr_FR.iso885915@euro
$ locale charmap
ISO-8859-15
ฉันได้มีการปรับเปลี่ยนสภาพแวดล้อมของฉันที่ชุดอักขระในขณะนี้คือ ISO-8859-15 (สิ่งอื่น ๆ เช่นภาษาสัญลักษณ์สกุลเงินรูปแบบวันนอกจากนี้ยังได้รับการแก้ไขคอลเลกชันของการตั้งค่าภูมิภาคเหล่านั้นถูกเรียกว่าเป็นสถานที่เกิดเหตุ ) ฉันต้องเริ่มต้นเทอร์มินัลอีมูเลเตอร์ใหม่ในสภาพแวดล้อมนั้นเพื่อปรับการแสดงผลตัวละครให้เข้ากับสถานที่ใหม่
ISO-8859-15 เป็นชุดอักขระไบต์เดียวซึ่งหมายความว่ามีเพียง 256 อักขระ (จริง ๆ แล้วยังน้อยกว่าที่ครอบคลุมจริง) ชุดอักขระเฉพาะนั้นใช้สำหรับภาษาของยุโรปตะวันตกเนื่องจากครอบคลุมภาษาส่วนใหญ่ (และสัญลักษณ์ยูโร)
มันมีa
ตัวอักษรที่มีค่าไบต์ 65 เช่นใน UTF-8 หรือ ASCII มันยังมีé
ตัวละคร (เช่นที่ใช้กันทั่วไปในฝรั่งเศสหรือสเปนเป็นต้น) แต่ด้วยค่าไบต์ 233 มันไม่มีตัวอักษร乕
ในสภาพแวดล้อมนั้นwc -c
และwc -m
จะให้ผลลัพธ์เดียวกันเสมอ
ใน Ubuntu เหมือนกับระบบ Unix ที่ทันสมัยที่สุดค่าเริ่มต้นมักจะเป็น UTF-8 เนื่องจากเป็นชุดอักขระ (และการเข้ารหัส) ที่รองรับเท่านั้นที่ครอบคลุมช่วง Unicode ทั้งหมด
มีการเข้ารหัสตัวอักษรแบบหลายไบต์อื่น ๆ แต่มันก็ไม่ได้รับการสนับสนุนอย่างดีบน Ubuntu และคุณต้องผ่านการวนซ้ำเพื่อให้สามารถสร้างสถานที่กับสิ่งเหล่านั้นได้และถ้าคุณทำคุณจะพบว่าหลายสิ่งไม่ ทำงานอย่างถูกต้อง
ดังนั้นเมื่อใช้กับ Ubuntu ชุดอักขระจะเป็นไบต์เดียวหรือ UTF-8
ตอนนี้อีกไม่กี่หมายเหตุ:
ใน UTF-8 ไม่ใช่ลำดับไบต์ทั้งหมดที่มีอักขระที่ถูกต้อง ตัวอย่างเช่นตัวอักษร UTF-8 ทั้งหมดที่ไม่ใช่ ASCII จะถูกสร้างขึ้นด้วยไบต์ที่ทุกคนมีชุดบิตที่ 8 แต่มีเพียงชุดแรกเท่านั้นที่มีชุดบิตที่ 7
หากคุณมีลำดับไบต์ที่มีการตั้งค่าบิตที่ 8 ซึ่งไม่มีการตั้งค่าบิตที่ 7 จากนั้นไม่สามารถแปลเป็นอักขระ และเมื่อคุณเริ่มมีปัญหาและความไม่สอดคล้องเนื่องจากซอฟต์แวร์ไม่รู้ว่าจะทำอย่างไรกับสิ่งเหล่านั้น ตัวอย่างเช่น
$ printf '\200\200\200' | wc -mc
0 3
$ printf '\200\200\200' | grep -q . || echo no
no
wc
และgrep
พบว่าไม่มีตัวละครในนั้น แต่:
$ x=$'\200\200\200' bash -c 'echo "${#x}"'
3
bash
พบ 3. เมื่อไม่สามารถแม็พลำดับของไบต์กับอักขระมันจะพิจารณาอักขระแต่ละไบต์
มันอาจมีความซับซ้อนมากขึ้นเนื่องจากมี codepoints ใน Unicode ที่ไม่ถูกต้องเป็นตัวอักษรและบางตัวที่ไม่ใช่ตัวอักษรและขึ้นอยู่กับเครื่องมือการเข้ารหัส UTF-8 อาจขึ้นอยู่กับว่าเป็นตัวอักษรหรือไม่
สิ่งที่ควรคำนึงถึงอีกประการหนึ่งคือความแตกต่างระหว่างตัวละครกับกราฟและวิธีการแสดงผล
$ printf 'e\u301\u20dd\n'
é⃝
$ printf 'e\u301\u20dd' | wc -mc
3 6
ที่นั่นเรามีรหัส 3 ตัวอักษรเป็น 6 ไบต์ที่แสดงเป็นหนึ่งกราฟเพราะเรามี 3 ตัวอักษรรวมกัน (ตัวละครฐานหนึ่งการรวมกันของสำเนียงเฉียบพลันและวงกลมล้อมรอบการรวมกัน)
การนำ GNU ไปใช้wc
ตามที่พบในอูบุนตูมี-L
สวิตช์เพื่อบอกความกว้างในการแสดงผลของบรรทัดที่กว้างที่สุดในอินพุต:
$ printf 'e\u301\u20dd\n' | wc -L
1
คุณจะพบว่าตัวละครบางตัวใช้ 2 เซลล์ในการคำนวณความกว้างเช่นเดียวกับ乕
ตัวละครของเราจากด้านบน:
$ echo 乕 | wc -L
2
โดยสรุป: ในคำ wilder, ไบต์, ตัวละครและกราฟไม่จำเป็นต้องเหมือนกัน