UTF-8และISO-8859-1แตกต่างกันอย่างไร?
UTF-8และISO-8859-1แตกต่างกันอย่างไร?
คำตอบ:
UTF-8 เป็นการเข้ารหัสแบบหลายไบต์ที่สามารถแสดงถึงอักขระ Unicode ใด ๆ ISO 8859-1 เป็นการเข้ารหัสไบต์เดียวที่สามารถแสดงอักขระ Unicode 256 ตัวแรก ทั้งสองเข้ารหัส ASCII เหมือนกันทุกประการ
วิกิพีเดียอธิบายได้ดีพอสมควร: UTF-8เทียบกับLatin-1 (ISO-8859-1) อดีตคือการเข้ารหัสความยาวผันแปรการเข้ารหัสความยาวคงที่ไบต์เดียวหลัง Latin-1 เข้ารหัสเพียง 256 รหัสจุดแรกของชุดอักขระ Unicode ในขณะที่ UTF-8 สามารถใช้เพื่อเข้ารหัสจุดรหัสทั้งหมด ที่ระดับการเข้ารหัสทางกายภาพ codepoints 0 - 127 เท่านั้นที่ได้รับการเข้ารหัสเหมือนกัน จุดรหัส 128 - 255 แตกต่างกันโดยการเปลี่ยนลำดับ 2 ไบต์ด้วย UTF-8 ในขณะที่พวกเขาเป็นไบต์เดียวกับละติน -1
UTFเป็นตระกูลของการเข้ารหัสแบบหลายไบต์ที่สามารถแสดงถึงจุดรหัสUnicodeซึ่งสามารถแสดงอักขระได้สูงสุด 2 ^ 31 [ประมาณ 2 พันล้านตัวอักษร] UTF-8เป็นระบบเข้ารหัสที่ยืดหยุ่นซึ่งใช้ระหว่าง 1 ถึง 4 ไบต์เพื่อแสดงจุดโค้ด 2 ^ 21 [ประมาณ 2 ล้าน] จุดแรก
เนื้อเรื่องย่อสั้น ๆ : อักขระใด ๆ ที่มีรหัสจุด / เลขลำดับต่ำกว่า 127 หรือที่รู้จักกันว่า ASCII แบบ 7 บิตปลอดภัยจะแสดงด้วยลำดับ 1 ไบต์เช่นเดียวกับการเข้ารหัสไบต์เดียวอื่น ๆ ส่วนใหญ่ ตัวอักษรใด ๆ ที่มีจุดโค้ดข้างต้น 127 เป็นตัวแทนจากลำดับของสองคนหรือมากกว่าไบต์ที่มีรายละเอียดของการเข้ารหัสที่ดีที่สุดอธิบายที่นี่
ISO-8859เป็นชุดรูปแบบการเข้ารหัสไบต์เดียวที่ใช้แทนตัวอักษรที่สามารถแสดงในช่วง 127 ถึง 255 ตัวอักษรต่าง ๆ เหล่านี้ถูกกำหนดเป็น "ส่วน" ในรูปแบบ ISO-8859- nซึ่งเป็นที่คุ้นเคยที่สุด สิ่งเหล่านี้น่าจะเป็นISO-8859-1หรือที่เรียกว่า 'Latin-1' เช่นเดียวกับ UTF-8 ASCII ที่ปลอดภัยขนาด 7 บิตยังคงไม่ได้รับผลกระทบโดยไม่คำนึงถึงตระกูลการเข้ารหัสที่ใช้
ข้อเสียเปรียบของรูปแบบการเข้ารหัสนี้คือการไม่สามารถรองรับภาษาที่ประกอบด้วยสัญลักษณ์มากกว่า 128 ตัวหรือเพื่อแสดงสัญลักษณ์มากกว่าหนึ่งตระกูลในครั้งเดียวอย่างปลอดภัย นอกจากนี้การเข้ารหัส ISO-8859 ก็ไม่ได้รับความนิยมจากการเพิ่มขึ้นของ UTF ISO "Working Group" ซึ่งรับผิดชอบในเรื่องนี้ได้ถูกยกเลิกในปี 2004 ทำให้ต้องบำรุงรักษาคณะอนุกรรมการหลัก
ASCII: 7 บิต คะแนนรหัส 128
ISO-8859-1: 8 บิต คะแนนรหัส 256
UTF-8: 8-32 บิต (1-4 ไบต์) คะแนนรหัส 1,112,064
ทั้ง ISO-8859-1 และ UTF-8 สามารถใช้งานร่วมกับ ASCII ได้ แต่ UTF-8 ไม่สามารถใช้ร่วมกับ ISO-8859-1 ได้:
#!/usr/bin/env python3
c = chr(0xa9)
print(c)
print(c.encode('utf-8'))
print(c.encode('iso-8859-1'))
เอาท์พุท:
©
b'\xc2\xa9'
b'\xa9'
ISO-8859-1 เป็นมาตรฐานดั้งเดิมจากย้อนหลังในปี 1980 มันสามารถแสดงถึง 256 ตัวอักษรเท่านั้นจึงเหมาะสำหรับบางภาษาในโลกตะวันตก แม้จะมีภาษาที่รองรับหลายภาษา แต่ตัวละครบางตัวก็หายไป หากคุณสร้างไฟล์ข้อความในการเข้ารหัสนี้และลองคัดลอก / วางตัวอักษรจีนบางตัวคุณจะเห็นผลลัพธ์แปลก ๆ ดังนั้นอย่าใช้มัน Unicode ได้ยึดครองโลกและ UTF-8 นั้นเป็นมาตรฐานในทุกวันนี้เว้นแต่คุณจะมีเหตุผลดั้งเดิม (เช่นส่วนหัว HTTP ที่ต้องการใช้งานร่วมกับทุกสิ่ง)
จากมุมมองอื่นไฟล์ที่เข้ารหัสทั้ง unicode และ ascii ไม่สามารถอ่านได้เนื่องจากมีไบต์0xc0
ในไฟล์ดูเหมือนว่าจะอ่านโดย iso-8859-1 อย่างถูกต้อง ข้อแม้คือไฟล์ไม่ควรมีอักขระ Unicode อยู่ในนั้น
สิ่งสำคัญอีกข้อหนึ่งที่ควรตระหนัก: ถ้าคุณเห็นiso-8859-1
มันอาจหมายถึงWindows-1252มากกว่าISO / IEC 8859-18859-1 พวกเขาแตกต่างกันในช่วง 0x80–0x9F โดยที่ ISO 8859-1 มีรหัสควบคุม C1 และ Windows-1252 มีอักขระที่มีประโยชน์แทน
ตัวอย่างเช่น ISO 8859-1 มี 0x85 เป็นอักขระควบคุม (ใน Unicode, U + 0085, ``) ในขณะที่ Windows-1252 มีจุดไข่ปลาแนวนอน (ใน Unicode, U + 2026 HORIZONTAL ELLIPSIS, …
)
WHATWG การเข้ารหัสข้อมูลจำเพาะ (ที่ใช้โดย HTML) ประกาศชัดiso-8859-1
จะเป็นฉลากหาwindows-1252
และเว็บเบราเซอร์ไม่สนับสนุนมาตรฐาน ISO 8859-1 ในทางใดทาง: ข้อมูลจำเพาะ HTML กล่าวว่าการเข้ารหัสทั้งหมดในสเป็คการเข้ารหัสจะต้องได้รับการสนับสนุนและไม่มาก .
ที่น่าสนใจคือการอ้างอิงอักขระตัวเลข HTML นั้นใช้ Windows-1252 เป็นค่า 8 บิตแทนการใช้รหัส Unicode ต่อhttps://html.spec.whatwg.org/#numeric-character-reference-end-state , …
จะผลิต U + 2026 มากกว่า U + 0085
เหตุผลของฉันสำหรับการค้นคว้าคำถามนี้มาจากมุมมองคืออะไรพวกเขาเข้ากันได้ในทางใด ชุดอักขระ Latin1 (iso-8859) สามารถใช้ร่วมกันได้ 100% เพื่อเก็บไว้ในที่เก็บข้อมูล utf8 ASCII ทั้งหมดและ Extended-ascii chars จะถูกเก็บไว้เป็นไบต์เดียว
การใช้วิธีอื่นจาก utf8 ไปยังชุดอักขระ Latin1 อาจทำงานได้หรือไม่ก็ได้ หากมีอักขระ 2 ไบต์ (ตัวอักษรเกิน Extended-Ascii 255) พวกเขาจะไม่เก็บไว้ในที่เก็บข้อมูล Latin1