ความแตกต่างของ Unicode, UTF, ASCII, ANSI


352

ความแตกต่างระหว่างคืออะไรUnicode, UTF8, UTF7, UTF16, UTF32, ASCIIและANSIการเข้ารหัส?

สิ่งเหล่านี้มีประโยชน์สำหรับโปรแกรมเมอร์อย่างไร?


ไซต์ที่ดีที่สุดในการอ้างอิงคือ: msdn.microsoft.com/en-us/library/dd374081(VS.85).aspx
RamSri

6
มีความเกี่ยวข้องกันมาก: UTF-8 vs Unicode
Tobias Kienzler


คำตอบ:


470

ลงรายการของคุณ:

  • " Unicode " ไม่ใช่การเข้ารหัส แต่น่าเสียดายที่เอกสารจำนวนมากใช้เพื่ออ้างถึงการเข้ารหัส Unicode ที่ระบบใดระบบหนึ่งใช้ตามค่าเริ่มต้น บน Windows และ Java สิ่งนี้มักจะหมายถึง UTF-16 ในที่อื่น ๆ มันหมายถึง UTF-8 อย่างถูกต้อง Unicode หมายถึงชุดอักขระนามธรรมตัวเองไม่ได้เข้ารหัสเฉพาะ
  • UTF-16 : 2 ไบต์ต่อ "รหัสหน่วย" นี่เป็นรูปแบบดั้งเดิมของสตริงใน. NET และโดยทั่วไปใน Windows และ Java ค่าภายนอกBasic Multilingual Plane (BMP) ถูกเข้ารหัสเป็นคู่แทน สิ่งเหล่านี้เคยถูกใช้งานค่อนข้างบ่อย แต่ตอนนี้แอพพลิเคชั่นสำหรับผู้บริโภคจำนวนมากจะต้องรับรู้ถึงตัวอักษรที่ไม่ใช่ BMP เพื่อรองรับอิโมจิ
  • UTF-8 : การเข้ารหัสความยาวแปรผัน 1-4 ไบต์ต่อจุดรหัส ค่า ASCII ถูกเข้ารหัสเป็น ASCII โดยใช้ 1 ไบต์
  • UTF-7 : มักใช้สำหรับการเข้ารหัสเมล โอกาสคือถ้าคุณคิดว่าคุณต้องการและคุณไม่ได้ทำจดหมายคุณผิด (นั่นเป็นเพียงประสบการณ์ของฉันที่มีคนโพสต์ในกลุ่มข่าว ฯลฯ - ด้านนอกของจดหมายมันไม่ได้ใช้กันอย่างแพร่หลายเลย)
  • UTF-32 : การเข้ารหัสความกว้างคงที่โดยใช้ 4 ไบต์ต่อจุดรหัส สิ่งนี้ไม่ได้มีประสิทธิภาพมากนัก แต่ทำให้ชีวิตง่ายขึ้นนอก BMP ฉันมี. NET Utf32Stringclass เป็นส่วนหนึ่งของMiscUtil library ของคุณคุณควรต้องการมันหรือไม่ (ยังไม่ผ่านการทดสอบอย่างละเอียดมากนักขอให้ใส่ใจ)
  • ASCII : การเข้ารหัสไบต์เดียวเท่านั้นโดยใช้ 7 บิตด้านล่าง (รหัส Unicode จุด 0-127) ไม่มีสำเนียง ฯลฯ
  • ANSI: ไม่มีใครเข้ารหัส ANSI คงที่ - มีจำนวนมาก โดยปกติแล้วเมื่อมีคนพูดว่า "ANSI" พวกเขาหมายถึง "สถานที่เริ่มต้น / เพจรหัสสำหรับระบบของฉัน" ซึ่งได้รับจากEncoding.Defaultและมักจะเป็นWindows-1252แต่อาจเป็นตำแหน่งที่ตั้งอื่น

มีมากขึ้นบนหน้า Unicode ของฉันและเคล็ดลับสำหรับการแก้จุดบกพร่องปัญหา Unicode

ทรัพยากรขนาดใหญ่อื่น ๆ ของรหัสคือunicode.orgซึ่งมีข้อมูลมากกว่าที่คุณเคยจะสามารถที่จะทำงานทางผ่าน - อาจบิตมีประโยชน์มากที่สุดคือชาร์ตรหัส


6
คำว่า "ANSI" เมื่อใช้กับหน้ารหัส 8 บิตของ Microsoft เป็นชื่อที่ไม่ถูกต้อง พวกเขาใช้แบบร่างที่ส่งสำหรับมาตรฐาน ANSI แต่ ANSI นั้นไม่เคยสร้างมาตรฐาน Windows-1252 (หน้ารหัสที่ใช้บ่อยที่สุดที่เรียกว่า "ANSI") จะคล้ายกับ ISO 8859-1 (ละติน -1) ยกเว้นว่า Windows-1252 มีอักขระที่พิมพ์ได้ในช่วง 0x80..0x9F โดยที่ ISO 8859-1 มีอักขระควบคุมในช่วงนั้น Unicode ยังมีอักขระควบคุมในช่วงนั้น en.wikipedia.org/wiki/Windows_code_page
Keith Thompson

1
@ jp2code: ฉันจะไม่ - แต่คุณต้องแยกความแตกต่างระหว่าง "เนื้อหาที่ถูกส่งกลับผ่าน HTTP จากเว็บเซิร์ฟเวอร์" และ "เนื้อหาที่ถูกส่งทางอีเมล" ไม่ใช่เนื้อหาของหน้าเว็บที่ส่งอีเมล แต่เป็นแอปที่อยู่เบื้องหลัง เนื้อหาของเว็บจะดีที่สุดใน UTF-8 เนื้อหาเมลอาจเป็น UTF-7 แต่ฉันสงสัยว่ามันคงเป็นไปได้ที่ UTF-8 ทุกวันนี้
Jon Skeet

2
สำหรับ UTF-16, IMHO ฉันจะพูดว่า "2 ไบต์ต่อหน่วยรหัส" เนื่องจากจุดโค้ดนอก BMP จะถูกเข้ารหัสในคู่ตัวแทนแทนเป็น 2 หน่วยโค้ด (4 ไบต์)
Ludovic Kuty

1
คิดถึงความแตกต่างระหว่าง UTF-16LE (ภายใน. NET) และ BE รวมถึงแนวคิดของ BOM
Maarten Bodewes

2
@ แอนดรูว์: ไม่ไม่มีตัวเข้ารหัส (ทั่วไป) Windows 1252 ไม่สามารถแทน Unicode BOM ได้และมันก็ไม่สมเหตุสมผลเพราะมันเป็นเพียงการเข้ารหัสแบบหนึ่งไบต์ต่ออักขระ
Jon Skeet

69

การอ่านเพื่อให้คุณเริ่มต้นจากการเข้ารหัสอักขระ: Joel บนซอฟต์แวร์: ขั้นต่ำที่แน่นอนผู้พัฒนาซอฟต์แวร์ทุกรายอย่างแน่นอนต้องรู้อย่างแน่นอนเกี่ยวกับ Unicode และชุดอักขระ (ไม่มีข้อแก้ตัว!)

โดยวิธีการ - ASP.NET ไม่มีอะไรจะทำกับมัน การเข้ารหัสเป็นสากล


7
ตอบที่นี่ 6 ปีหลังจากเขียนบทความ ฉันอ่าน 8 ปีหลังจากโพสต์เขียน 14 ปีต่อมาและมันก็ยังอ่านได้ดี นั่นเป็นมากกว่าครึ่งชีวิตของฉันมาแล้ว เหลือเชื่อ
Dave Knise
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.