ดูเพิ่มเติมได้อย่างไรว่าไฟล์ที่มีตัวอักษรจีนรู้จำนวนไบต์ที่ต้องใช้ต่ออักขระ? - ไม่ต้องสงสัยเลยว่ามีคำถาม SO อื่น ๆ ที่จะช่วยได้เช่นกัน
ใน UTF-8 คุณจะได้รับไบต์ประเภทต่อไปนี้:
Binary Hex Comments
0xxxxxxx 0x00..0x7F Only byte of a 1-byte character encoding
10xxxxxx 0x80..0xBF Continuation bytes (1-3 continuation bytes)
110xxxxx 0xC0..0xDF First byte of a 2-byte character encoding
1110xxxx 0xE0..0xEF First byte of a 3-byte character encoding
11110xxx 0xF0..0xF4 First byte of a 4-byte character encoding
(บรรทัดสุดท้ายดูเหมือนว่าควรอ่าน 0xF0..0xF7 อย่างไรก็ตามช่วง 21 บิตของ Unicode (U + 0000 - U + 10FFFF) หมายความว่าค่าที่ถูกต้องสูงสุดคือ 0xF4 ค่า 0xF5..0xF7 ไม่สามารถเกิดขึ้นได้ใน UTF-8 ที่ถูกต้อง)
การพิจารณาว่าลำดับไบต์เฉพาะเป็น UTF-8 ที่ถูกต้องหรือไม่หมายความว่าคุณต้องคิดถึง:
- ไบต์ต่อเนื่องปรากฏในที่ที่ไม่คาดคิด
- ไบต์ที่ไม่ต่อเนื่องปรากฏขึ้นซึ่งคาดว่าจะมีไบต์ต่อเนื่อง
- อักขระที่ไม่สมบูรณ์ในตอนท้ายของสตริง (รูปแบบของ 'คาดว่าไบต์ต่อเนื่อง')
- ลำดับที่ไม่น้อยที่สุด
- UTF-16 ตัวแทน
ใน UTF-8 ที่ถูกต้องไม่สามารถเกิดไบต์ 0xF5..0xFF ได้
ลำดับที่ไม่น้อยที่สุด
มีการแสดงที่เป็นไปได้หลายอย่างสำหรับอักขระบางตัว ตัวอย่างเช่นอักขระ Unicode U + 0000 (ASCII NUL) สามารถแสดงโดย:
0x00
0xC0 0x80
0xE0 0x80 0x80
0xF0 0x80 0x80 0x80
อย่างไรก็ตามมาตรฐาน Unicode ระบุไว้อย่างชัดเจนว่าทางเลือกสามทางเลือกสุดท้ายไม่สามารถยอมรับได้เนื่องจากมีไม่น้อย มันจะเกิดขึ้นที่ไบต์ 0xC0 และ 0xC1 ไม่สามารถปรากฏใน UTF-8 ที่ถูกต้องได้เนื่องจากอักขระเพียงตัวเดียวที่สามารถเข้ารหัสโดยเหล่านั้นได้รับการเข้ารหัสน้อยที่สุดเป็นอักขระไบต์เดียวในช่วง 0x00..0x7F
UTF-16 ตัวแทน
ภายใน Basic Multi-lingual Plane (BMP) ค่า Unicode U + D800 - U + DFFF สงวนไว้สำหรับตัวแทน UTF-16 และไม่สามารถเข้ารหัสใน UTF-8 ที่ถูกต้องได้ หากถูกต้องใน UTF-8 (ซึ่งฉันเน้นว่าไม่ใช่) ตัวแทนจะถูกเข้ารหัส:
- U + D800 - 0xED 0xA0 0x80 (ตัวแทนระดับสูงที่เล็กที่สุด)
- U + DBFF - 0xED 0xAF 0xBF (ตัวแทนสูงที่ใหญ่ที่สุด)
- U + DC00 - 0xED 0xB0 0x80 (ตัวแทนต่ำสุดที่เล็กที่สุด)
- U + DFFF - 0xED 0xBF 0xBF (ตัวแทนต่ำสุดที่ใหญ่ที่สุด)
ข้อมูลไม่ถูกต้อง
ดังนั้นข้อมูล BAD ของคุณควรมีตัวอย่างที่ละเมิดข้อกำหนดต่างๆเหล่านี้
- ไบต์ต่อเนื่องไม่ได้นำหน้าด้วยค่าไบต์เริ่มต้นอย่างใดอย่างหนึ่ง
- ไบต์เริ่มต้นแบบหลายอักขระไม่ได้ตามด้วยไบต์ความต่อเนื่องเพียงพอ
- อักขระแบบหลายไบต์ที่ไม่น้อยที่สุด
- UTF-16 ตัวแทน
- ไบต์ไม่ถูกต้อง (0xC0, 0xC1, 0xF5..0xFF)
โปรดทราบว่าเครื่องหมายลำดับไบต์ (BOM) U + FEFF หรือที่เรียกว่าช่องว่างที่ไม่มีความกว้างเป็นศูนย์ (ZWNBSP) ไม่สามารถปรากฏขึ้นโดยไม่ได้เข้ารหัสใน UTF-8 - ไม่อนุญาตให้ใช้ไบต์ 0xFF และ 0xFE ใน UTF-8 ที่ถูกต้อง ZWNBSP ที่เข้ารหัสสามารถปรากฏในไฟล์ UTF-8 เป็น 0xEF 0xBB 0xBF แต่ BOM นั้นไม่จำเป็นอย่างยิ่งใน UTF-8
นอกจากนี้ยังมีnoncharactersบางตัวใน Unicode U + FFFE และ U + FFFF เป็นตัวอักษรสองตัว (และสองจุดรหัสสุดท้ายในแต่ละระนาบ, U + 1FFFE, U + 1FFFF, U + 2FFFE, U + 2FFFF, ... U + 10FFFE, U + 10FFFF เป็นอื่น ๆ ). โดยปกติสิ่งเหล่านี้ไม่ควรปรากฏในข้อมูล Unicode สำหรับการแลกเปลี่ยนข้อมูล แต่สามารถปรากฏในการใช้งานส่วนตัว ดูลิงก์คำถามที่พบบ่อยของ Unicode สำหรับรายละเอียดที่ไม่ดีรวมถึงประวัติที่ค่อนข้างซับซ้อนของ noncharacters ใน Unicode ( Corrigendum # 9: Clarification About Noncharactersซึ่งเปิดตัวในเดือนมกราคม 2013 ทำในสิ่งที่ชื่อแนะนำ - ชี้แจงความหมายของอักขระที่ไม่ใช่ตัวอักษร)