Unicode, Unicode Big Endian หรือ UTF-8? อะไรคือความแตกต่าง? รูปแบบใดดีกว่า


19

เมื่อฉันพยายามที่จะบันทึกไฟล์ข้อความด้วยที่ไม่ใช่ภาษาอังกฤษข้อความใน Notepad ฉันจะได้รับตัวเลือกให้เลือกระหว่างUnicode , Unicode Big EndianและUTF-8 รูปแบบเหล่านี้แตกต่างกันอย่างไร

สมมติว่าฉันไม่ต้องการความเข้ากันได้แบบย้อนหลัง (กับระบบปฏิบัติการเวอร์ชั่นเก่าหรือแอพ) และฉันไม่สนใจขนาดไฟล์รูปแบบใดที่ดีกว่า

(สมมติว่าข้อความสามารถเป็นภาษาเช่นจีนหรือญี่ปุ่นนอกเหนือจากภาษาอื่น ๆ )

หมายเหตุ:จากคำตอบและความคิดเห็นด้านล่างดูเหมือนว่าใน Notepad lingo, Unicode คือ UTF-16 (Little Endian), Unicode Big Endian คือ UTF-16 (Big Endian) และ UTF-8 นั้นดี UTF-8


คำตอบ:


19

dunno ไหนดีกว่า: เลื่อยหรือค้อน :-)

Unicode ไม่ใช่ UTF

มีบทความบางส่วนที่เกี่ยวข้องกับหัวเรื่องในขณะนี้:

  • UTF-8 มุ่งเน้นไปที่การลดขนาดไบต์สำหรับการแสดงอักขระจากชุด ASCII (การแทนความยาวผันแปร: อักขระแต่ละตัวจะมีขนาด 1 ถึง 4 ไบต์และอักขระ ASCII จะพอดีกับ 1 ไบต์) ในฐานะที่เป็นโจเอลวางไว้:

“ ดูเลขศูนย์ทั้งหมด!” พวกเขาพูดเพราะพวกเขาเป็นคนอเมริกันและพวกเขากำลังมองหาข้อความภาษาอังกฤษซึ่งไม่ค่อยได้ใช้รหัสจุดเหนือ U + 00FF พวกเขายังเป็นพวกฮิปปี้เสรีในแคลิฟอร์เนียที่ต้องการอนุรักษ์ (หัวเราะเยาะ) หากพวกเขาเป็นชาวเท็กซัสพวกเขาคงไม่คิดที่จะดื่มด่ำกับจำนวนไบต์เป็นสองเท่า แต่ wimps ของชาว California เหล่านั้นไม่สามารถเข้าใจความคิดของการเพิ่มจำนวนของที่เก็บข้อมูลที่ใช้สำหรับสายอักขระ

  • UTF-32 มุ่งเน้นไปที่ความครบถ้วนสมบูรณ์และความยาวคงที่โดยใช้ 4 ไบต์สำหรับตัวละครทั้งหมด มันเป็นการแปลที่ตรงไปตรงมามากที่สุดการจับคู่โดยตรงกับโค้ด Unicode ชี้ไปที่ 4 ไบต์ เห็นได้ชัดว่ามันมีขนาดไม่ใหญ่มาก

  • UTF-16 เป็นการประนีประนอมโดยใช้เวลาส่วนใหญ่ 2 ไบต์ แต่ขยายเป็น 2 * 2 ไบต์ต่ออักขระเพื่อแทนอักขระบางตัวซึ่งไม่รวมอยู่ใน Basic Multilingual Plane (BMP)

โปรดดูขั้นต่ำสุดยอดอย่างแน่นอนผู้พัฒนาซอฟต์แวร์ทุกรายต้องรู้อย่างแน่นอนเกี่ยวกับ Unicode และชุดอักขระ (ไม่มีข้อแก้ตัว!)


4
ปัญหามาจากการที่ Unicode เป็นการ 'เข้ารหัส' แต่ไม่ได้อยู่ในความหมายของตัวเลข UTF-8/16/32 เป็นการเข้ารหัส Unicode ทั้งหมด แต่ Unicode นั้นเป็นการแมปจากสัญลักษณ์ไปยังหมายเลข พวกเขาสามารถใช้คำศัพท์เฉพาะเพิ่มเติมเพื่อหลีกเลี่ยงความสับสนนี้ฉันคิดว่า
jerryjvl

4
แม้ว่าจะคำนึงถึง OP ของคำถามแล้วอัตราต่อรองคือแอปพลิเคชันหมายถึง 'UTF-16' โดยที่มันบอกว่า 'Unicode'
jerryjvl

3
ฉันไม่แน่ใจว่าเป้าหมายของ UTF-8 คือ "การอนุรักษ์" ซึ่งตรงกันข้ามกับความเข้ากันได้ของ ASCII
Mr. Shiny และ New 安宇

@Johannes: Unicode Consortium ได้ตัดสินใจที่จะไม่กำหนดรหัสคะแนนเหนือ U + 10FFFF เพราะไม่สามารถแสดงใน UTF-16 ได้ นี่เป็นผลของการ จำกัด UTF-8 ถึง 4 ไบต์
46971

1
"Unicode ไม่ใช่ UTF" - สำหรับหลาย ๆ คนมันคือ WTF;)
mlvljr

4

สำหรับภาษายุโรป UTF-8 นั้นเล็กกว่า สำหรับภาษาตะวันออกความแตกต่างไม่ชัดเจนนัก

ทั้งสองจะจัดการอักขระ Unicode ที่เป็นไปได้ทั้งหมดดังนั้นจึงไม่ควรสร้างความแตกต่างในความเข้ากันได้


3

มีการเข้ารหัสอักขระ Unicode มากกว่าที่คุณคิด

  • UTF 8

    การเข้ารหัส UTF-8 คือความกว้างของตัวแปรตั้งแต่ 1-4 ไบต์โดยมีบิตบนของแต่ละไบต์ที่สงวนไว้เป็นบิตควบคุม บิตนำหน้าของไบต์แรกระบุจำนวนไบต์ทั้งหมดที่ใช้สำหรับอักขระนั้น ค่าสเกลาร์ของจุดรหัสของตัวละครคือการต่อเชื่อมของบิตที่ไม่ได้ควบคุม ในตารางนี้xแสดงถึงค่าต่ำสุด 8 บิตของค่า Unicodeyแสดงถึง 8 บิตสูงกว่าถัดไปและzแสดงถึงบิตที่สูงกว่านั้น

    Unicode              Byte1     Byte2     Byte3     Byte4
    U+0000-U+007F       0xxxxxxx            
    U+0080-U+07FF       110yyyxx  10xxxxxx          
    U+0800-U+FFFF       1110yyyy  10yyyyxx  10xxxxxx    
    U+10000-U+10FFFF    11110zzz  10zzyyyy  10yyyyxx  10xxxxxx
    
  • UCS-16
  • UCS-16BE
  • UCS-16LE

  • UTF-16
  • UTF-16BE
  • UTF-16LE

  • UTF-32
  • UTF-32-BE

1
มีการเข้ารหัสอักขระ Unicode มากกว่าที่คุณแสดงไว้ ตัวอย่างเช่นUTF-1 , UTF-7 , UTF-EBCDIC , GB-18030 , MIME , UTF-9 และ UTF-18 ... คุณยังสามารถใช้รูปแบบการเข้ารหัสไบนารีเพื่อเข้ารหัสข้อมูล Unicode อ่านเพิ่มเติมการเปรียบเทียบการเข้ารหัส Unicode
phuclv

1

"Unicode" เป็นอีกคำหนึ่งสำหรับ "UTF-16" ซึ่งเป็นการเข้ารหัสอักขระ Unicode ที่ตั้งค่าเป็นสิบหกบิตต่ออักขระ UTF-8 เข้ารหัสเป็นแปดบิตต่อตัวอักษร

ในทั้งสองกรณีโอเวอร์โฟลว์ใด ๆ จะถูกจัดสรรให้กับอีก 16 หรือแปดบิต


อันไหนดีกว่ากัน?
R. Martinho Fernandes

"ขึ้นอยู่กับสถานการณ์"
จอห์นแซนเดอร์

ถึงแม้ว่าสำหรับคำถามเฉพาะนี้ดูเหมือนว่า "Unicode" จะถูกลบล้างเป็นคำอื่นสำหรับ "UTF-16" แต่โดยทั่วไปก็ไม่ได้เป็นเช่นนั้น - ดูคำตอบของ Jason
Arjan

1
คุณหมายถึง "ต่อหน่วยรหัส" ไม่ใช่ "ต่อตัวอักษร"; ทั้ง UTF-8 และ UTF-16 สามารถใช้รหัสหลายหน่วยในการแสดงอักขระ และ "Unicode" an "UTF-16" ไม่ใช่สิ่งเดียวกันยกเว้นในคำศัพท์ของ Microsoft
user46971

1

ข้อได้เปรียบที่แท้จริงเพียงอย่างเดียวของไฟล์ขนาดเล็กเช่นไฟล์ข้อความคือขนาดไฟล์ที่ได้ โดยทั่วไป UTF-8 จะสร้างไฟล์ที่เล็กกว่า แต่ความแตกต่างนี้อาจมีความชัดเจนน้อยลงด้วยข้อความภาษาจีน / ญี่ปุ่น


โปรดทราบว่ามีความแตกต่างในแบนด์วิดท์เครือข่ายและการใช้หน่วยความจำ
เจสันเบเกอร์

1
"โดยทั่วไป UTF-8 จะสร้างไฟล์ที่เล็กกว่า": โดยทั่วไปไม่ได้ UTF-8 ผลิตไฟล์ที่เล็กกว่าสำหรับไฟล์ ASCII หากไฟล์ประกอบด้วย Unicode codepoints ด้านบน U + 0800 ไฟล์นั้นจะมีขนาดใหญ่กว่าใน UTF-8 มากกว่าใน UTF-16
sleske

0

ในคำเดียว Unicode เป็นชุดตัวอักษรในขณะที่ Unicode Big Endian และ utf-8 เป็นการเข้ารหัสสองตัวซึ่งใช้ในการจัดเก็บอักขระเป็น 01 บนคอมพิวเตอร์


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