UTF-8 และ ISO-8859-1 แตกต่างกันอย่างไร?


คำตอบ:


321

UTF-8 เป็นการเข้ารหัสแบบหลายไบต์ที่สามารถแสดงถึงอักขระ Unicode ใด ๆ ISO 8859-1 เป็นการเข้ารหัสไบต์เดียวที่สามารถแสดงอักขระ Unicode 256 ตัวแรก ทั้งสองเข้ารหัส ASCII เหมือนกันทุกประการ


11
สิ่งหนึ่งที่ควรทราบว่า ASCII ขยายจาก 0 ถึง 127 เท่านั้น MSB อยู่เสมอ 0
Hritik

3
เมื่อมีการกำหนดแต้มของรหัสที่สูงกว่า 127 ระบบเข้ารหัสเป็นเวอร์ชันของ Extended ASCII
Rohan Bhale

1
@RohanBhale อย่าใช้วลี Extended ASCII; มันจะทำให้เกิดความสับสนเท่านั้น
Mr Lister

แต่ ascii แบบขยายอาจเป็นคำที่ถูกต้อง ฉันอ่านมันในหลายแหล่งข้อมูล
Rohan Bhale

135

วิกิพีเดียอธิบายได้ดีพอสมควร: UTF-8เทียบกับLatin-1 (ISO-8859-1) อดีตคือการเข้ารหัสความยาวผันแปรการเข้ารหัสความยาวคงที่ไบต์เดียวหลัง Latin-1 เข้ารหัสเพียง 256 รหัสจุดแรกของชุดอักขระ Unicode ในขณะที่ UTF-8 สามารถใช้เพื่อเข้ารหัสจุดรหัสทั้งหมด ที่ระดับการเข้ารหัสทางกายภาพ codepoints 0 - 127 เท่านั้นที่ได้รับการเข้ารหัสเหมือนกัน จุดรหัส 128 - 255 แตกต่างกันโดยการเปลี่ยนลำดับ 2 ไบต์ด้วย UTF-8 ในขณะที่พวกเขาเป็นไบต์เดียวกับละติน -1


@mu บางทีคำสั่งของฉันอาจจะคลุมเครือ แต่ก็ไม่ถูกต้อง - ฉันไม่ได้พูดถึงลำดับไบต์ที่เข้ารหัส แต่แทนที่จะเป็นชุดอักขระที่เข้ารหัส หมายความว่า ISO-8859-1 ถูกใช้เพื่อเข้ารหัสจุดรหัส 256 จุดแรกของชุดอักขระ Unicode
StaxMan

คำชี้แจงของคุณใช้ได้กับฉันและ "คลุมเครือ" น่าจะเป็นตัวเลือกคำที่ดีกว่า "ไม่ถูกต้อง"
mu สั้นเกินไป

83

UTF

UTFเป็นตระกูลของการเข้ารหัสแบบหลายไบต์ที่สามารถแสดงถึงจุดรหัสUnicodeซึ่งสามารถแสดงอักขระได้สูงสุด 2 ^ 31 [ประมาณ 2 พันล้านตัวอักษร] UTF-8เป็นระบบเข้ารหัสที่ยืดหยุ่นซึ่งใช้ระหว่าง 1 ถึง 4 ไบต์เพื่อแสดงจุดโค้ด 2 ^ 21 [ประมาณ 2 ล้าน] จุดแรก

เนื้อเรื่องย่อสั้น ๆ : อักขระใด ๆ ที่มีรหัสจุด / เลขลำดับต่ำกว่า 127 หรือที่รู้จักกันว่า ASCII แบบ 7 บิตปลอดภัยจะแสดงด้วยลำดับ 1 ไบต์เช่นเดียวกับการเข้ารหัสไบต์เดียวอื่น ๆ ส่วนใหญ่ ตัวอักษรใด ๆ ที่มีจุดโค้ดข้างต้น 127 เป็นตัวแทนจากลำดับของสองคนหรือมากกว่าไบต์ที่มีรายละเอียดของการเข้ารหัสที่ดีที่สุดอธิบายที่นี่

ISO-8859

ISO-8859เป็นชุดรูปแบบการเข้ารหัสไบต์เดียวที่ใช้แทนตัวอักษรที่สามารถแสดงในช่วง 127 ถึง 255 ตัวอักษรต่าง ๆ เหล่านี้ถูกกำหนดเป็น "ส่วน" ในรูปแบบ ISO-8859- nซึ่งเป็นที่คุ้นเคยที่สุด สิ่งเหล่านี้น่าจะเป็นISO-8859-1หรือที่เรียกว่า 'Latin-1' เช่นเดียวกับ UTF-8 ASCII ที่ปลอดภัยขนาด 7 บิตยังคงไม่ได้รับผลกระทบโดยไม่คำนึงถึงตระกูลการเข้ารหัสที่ใช้

ข้อเสียเปรียบของรูปแบบการเข้ารหัสนี้คือการไม่สามารถรองรับภาษาที่ประกอบด้วยสัญลักษณ์มากกว่า 128 ตัวหรือเพื่อแสดงสัญลักษณ์มากกว่าหนึ่งตระกูลในครั้งเดียวอย่างปลอดภัย นอกจากนี้การเข้ารหัส ISO-8859 ก็ไม่ได้รับความนิยมจากการเพิ่มขึ้นของ UTF ISO "Working Group" ซึ่งรับผิดชอบในเรื่องนี้ได้ถูกยกเลิกในปี 2004 ทำให้ต้องบำรุงรักษาคณะอนุกรรมการหลัก


1
+1 สำหรับการตอบคำถาม แต่เหนือกว่าและเสนอข้อมูลเกี่ยวกับการเข้ารหัสที่เกี่ยวข้อง Re: รหัสคะแนนสำหรับ UTF-8 อ้างอิงจากstackoverflow.com/a/38488358/3353984 , UTF-8 รองรับคะแนนรหัส 2 ^ 21 นั่นเป็นข้อผิดพลาดหรืออาจจำเป็นต้องแก้ไขที่นี่
Tom Loredo

1
ยูนิโค้ดเป็นจริง 17 เครื่องบินของ 2 คะแนนรหัส ^ 2 0x00_0000 ถึง 0x1F_FFFF เครื่องบิน 17 ลำสามารถรับคะแนนได้ 1,114,112 คะแนน ในจำนวนนี้มีตัวแทนตั้งครรภ์ 2,048 คน 66 คนไม่ใช่ตัวละครและ 137,468 คนถูกสงวนไว้สำหรับการใช้งานส่วนตัวโดยเหลือ 974,530 คนสำหรับงานสาธารณะ 1 ล้าน ดูจำนวนอักขระที่สามารถเข้ารหัส UTF-8 ได้ .
georgeawg

22
  • 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'

21

ISO-8859-1 เป็นมาตรฐานดั้งเดิมจากย้อนหลังในปี 1980 มันสามารถแสดงถึง 256 ตัวอักษรเท่านั้นจึงเหมาะสำหรับบางภาษาในโลกตะวันตก แม้จะมีภาษาที่รองรับหลายภาษา แต่ตัวละครบางตัวก็หายไป หากคุณสร้างไฟล์ข้อความในการเข้ารหัสนี้และลองคัดลอก / วางตัวอักษรจีนบางตัวคุณจะเห็นผลลัพธ์แปลก ๆ ดังนั้นอย่าใช้มัน Unicode ได้ยึดครองโลกและ UTF-8 นั้นเป็นมาตรฐานในทุกวันนี้เว้นแต่คุณจะมีเหตุผลดั้งเดิม (เช่นส่วนหัว HTTP ที่ต้องการใช้งานร่วมกับทุกสิ่ง)


1
ฉันเคยเห็นที่ที่ Umlaut ไม่ได้ถูกแปลงด้วย UTF8 เราเห็นตัวอย่างของสิ่งนี้และในการค้นหาเราพบ ISO-8859-1 และดูเหมือนว่าจะใช้งานได้ เรามีนักวิทยาศาสตร์ชาวเยอรมันจำนวนมากที่เราทำงานด้วย
Aggie Jon จาก 87

4
Umlaut's แสดงเป็นอักขระสองตัวใน utf8 พวกเขาแปลงได้ดีและทำงานได้ดี ปัญหามาจากโปรแกรมที่คาดว่า 1 ไบต์ต่อตัวอักษร สำหรับโปรแกรมดั้งเดิมเหล่านี้ ISO-8859-1 มีขนาด 1 ไบต์ umlaut
Erik Aronesty

3

จากมุมมองอื่นไฟล์ที่เข้ารหัสทั้ง unicode และ ascii ไม่สามารถอ่านได้เนื่องจากมีไบต์0xc0ในไฟล์ดูเหมือนว่าจะอ่านโดย iso-8859-1 อย่างถูกต้อง ข้อแม้คือไฟล์ไม่ควรมีอักขระ Unicode อยู่ในนั้น


2

สิ่งสำคัญอีกข้อหนึ่งที่ควรตระหนัก: ถ้าคุณเห็น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


อ๊ะ! คิดว่าฉันจะเขียนมัน แต่ฉันเขียนมันหายไป ฉันได้ใส่เข้าไปแล้ว
Chris Morgan

0

เหตุผลของฉันสำหรับการค้นคว้าคำถามนี้มาจากมุมมองคืออะไรพวกเขาเข้ากันได้ในทางใด ชุดอักขระ Latin1 (iso-8859) สามารถใช้ร่วมกันได้ 100% เพื่อเก็บไว้ในที่เก็บข้อมูล utf8 ASCII ทั้งหมดและ Extended-ascii chars จะถูกเก็บไว้เป็นไบต์เดียว

การใช้วิธีอื่นจาก utf8 ไปยังชุดอักขระ Latin1 อาจทำงานได้หรือไม่ก็ได้ หากมีอักขระ 2 ไบต์ (ตัวอักษรเกิน Extended-Ascii 255) พวกเขาจะไม่เก็บไว้ในที่เก็บข้อมูล Latin1


2
มีประโยชน์ แต่ฉันคิดว่าคุณหมายถึง 127 แทน 255 ใน Extended-Ascii 255
Hydroper

18
Latin-1 หรือ iso-8859-1 เข้ากันไม่ได้ 100% ที่จะเก็บไว้ใน utf8 อักขระละติน -n หรือ iso-8859-n ที่สูงกว่า 127 จะไม่ถูกแปลเป็นอักขระไบต์ utf-8 เดียว อย่างไรก็ตามสำหรับค่า 1-127 พวกเขาจะแปลอย่างแน่นอน
Marlin Pierce

4
คำตอบนี้ค่อนข้างสับสนในการใช้คำว่า "Extended ascii" ซึ่งเป็นคำที่ใช้อ้างอิงการเข้ารหัสอักขระใด ๆ ที่ไม่ใช่ ASCII UTF-8 และ latin-1 เป็นตัวอย่างของการเข้ารหัสแบบ ASCII เพิ่มเติม แต่ตัวอักษรที่ไม่ใช่ ascii latin-1 (เช่น. รหัสคะแนนสูงกว่า 127) ไม่สามารถเข้ารหัสเป็นไบต์เดียวใน UTF-8
rdb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.