ควรยกเลิกการเข้ารหัสอักขระนอกเหนือจาก UTF-8 (และอาจจะ UTF-16 / UTF-32) หรือไม่


31

สัตว์เลี้ยงของฉันกำลังมองหาโครงการซอฟต์แวร์จำนวนมากที่มีภูเขาของรหัสสำหรับการสนับสนุนชุดอักขระ อย่าเข้าใจฉันผิดฉันทุกคนเข้ากันได้และฉันดีใจที่ผู้แก้ไขข้อความให้คุณเปิดและบันทึกไฟล์ในชุดอักขระหลายชุด สิ่งที่ทำให้ฉันรำคาญคือการแพร่กระจายของการเข้ารหัสอักขระที่ไม่ใช่สากลนั้นมีชื่อว่า "การสนับสนุน Unicode ที่เหมาะสม" แทนที่จะเป็น "ปัญหา"

ตัวอย่างเช่นสมมติฉันเลือกใน PostgreSQL และสนับสนุนชุดอักขระ PostgreSQL เกี่ยวข้องกับการเข้ารหัสสองประเภท:

  • การเข้ารหัสไคลเอ็นต์: ใช้ในการสื่อสารระหว่างไคลเอ็นต์และเซิร์ฟเวอร์
  • การเข้ารหัสเซิร์ฟเวอร์: ใช้เพื่อจัดเก็บข้อความภายในฐานข้อมูล

ฉันสามารถเข้าใจได้ว่าทำไมการสนับสนุนการเข้ารหัสลูกค้าจำนวนมากเป็นสิ่งที่ดี ช่วยให้ลูกค้าที่ไม่ทำงานใน UTF-8 สามารถสื่อสารกับ PostgreSQL โดยไม่จำเป็นต้องทำการแปลง สิ่งที่ฉันไม่ได้รับคือ: ทำไม PostgreSQL จึงรองรับการเข้ารหัสเซิร์ฟเวอร์หลายเครื่อง ไฟล์ฐานข้อมูล (เกือบทุกครั้ง) ไม่สามารถใช้งานร่วมกันได้จากรุ่น PostgreSQL หนึ่งไปยังรุ่นถัดไปดังนั้นความเข้ากันได้ข้ามรุ่นจึงไม่ใช่ปัญหาที่นี่

UTF-8 เป็นชุดอักขระมาตรฐานที่เข้ากันได้กับ ASCII เท่านั้นที่สามารถเข้ารหัสรหัสสถานี Unicode ทั้งหมด (ถ้าฉันผิดให้ฉันรู้) ฉันอยู่ในค่ายที่ UTF-8 เป็นชุดตัวละครที่ดีที่สุดแต่ฉันก็ยินดีที่จะใส่ชุดอักขระสากลอื่น ๆ เช่น UTF-16 และ UTF-32

ฉันเชื่อว่าชุดอักขระที่ไม่ใช่สากลควรเลิกใช้แล้ว มีเหตุผลที่น่าสนใจที่พวกเขาไม่ควร?


4
@mario: นิยามดั้งเดิมของ UTF-8 อนุญาตให้มีได้สูงสุด 6 ไบต์ ต่อมาถูก จำกัด เทียมเพียงเพื่อปกปิดอักขระ UTF-16 เท่านั้นที่สามารถรองรับได้
dan04

6
อย่างน้อย PostgreSQL จงใจจัดการกับการเข้ารหัสอักขระหลายตัว มันแย่มากที่ต้องจัดการกับ UTF-8 และ windows-1252 แบบสุ่มเพราะบางคนไม่สนใจ
dan04

5
@ dan04: การทำงานกับข้อความภาษารัสเซียเคยเป็นความเจ็บปวดเนื่องจากพวกเขาใช้การเข้ารหัสหลายอย่างที่แตกต่างกันอย่างมากและมักจะแฮ็กสิ่งต่าง ๆ ให้ทำงานโดยใช้แบบอักษรที่แตกต่างกัน (ซึ่งมักจะโกหกเกี่ยวกับการเข้ารหัส สรุปเป็นระเบียบที่น่ากลัว ฉันสงสัยว่าพวกเขาทำความสะอาดแล้ว - อาจจะเป็น UTF-8 เพราะจำนวนการร้องขอการสนับสนุนจากทิศทางนั้นลดลงทันที
Donal Fellows

3
ช่วง Unicode เชิงทฤษฎีมีค่าตั้งแต่ 0 ถึง 0x10ffff ไม่มีอะไรเพิ่มเติม นั่นคือสิ่งที่มาตรฐาน Unicode กล่าว UTF-8 จัดการ Unicode ทั้งหมดและจะเสมอ มันไม่ครอบคลุมช่วงการเข้ารหัสที่ไม่ใช่ Unicode แต่ครอบคลุมถึง Unicode ทั้งหมด
gnasher729

คำตอบ:


16

ตั้งแต่ที่คุณพูดถึง PostgreSQL ฉันสามารถพูดได้ด้วยสิทธิ์บางอย่างว่าเหตุผลหลักที่ทำไมการเข้ารหัสที่ไม่ใช่ UTF8 ฝั่งเซิร์ฟเวอร์ได้รับการสนับสนุนในรายละเอียดเช่นนี้คือญี่ปุ่นต้องการมัน เห็นได้ชัดว่าการแปลงแบบไปกลับที่เหมือนกันระหว่าง Unicode และการเข้ารหัส "ดั้งเดิม" ของญี่ปุ่นนั้นเป็นไปไม่ได้เสมอไปและในบางกรณีตารางการแปลงอาจแตกต่างกันระหว่างผู้ขาย มันงุนงงจริงๆ แต่ก็ชัดเจน (การสนับสนุนชุดอักขระที่กว้างขวางเป็นเหตุผลหนึ่งที่ทำให้ PostgreSQL ได้รับความนิยมในญี่ปุ่น)

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

เหตุผลอื่น ๆ ที่กล่าวถึงในคำตอบอื่น ๆ ก็นำมาใช้เป็นข้อโต้แย้งที่สนับสนุน แต่ตราบใดที่ญี่ปุ่นไม่สามารถรองรับการตั้งค่าตัวอักษรได้


ดังนั้นเนื่องจากการเข้ารหัสเหล่านี้การแปลงข้อความเป็น UTF-8 และกลับมาเป็นความสูญเสียโดยทั่วไปหรือไม่ แม้ว่าการแปลงกลับจะเสร็จสิ้นในทันที (มากกว่า 6 เดือนนับจากนี้)?
Joey Adams

Joey Adams: เห็นได้ชัดเลย
Peter Eisentraut

3
Google สำหรับ“ การรวมกันของฮัน” เพื่อดูว่าทำไม
Petr Viktorin

7

เหตุผลสองประการที่ชัดเจน: ขึ้นอยู่กับข้อมูลที่คุณจัดเก็บการแปลงเป็นรูปแบบที่แตกต่างกันอาจใช้เวลาสักครู่และมีห้องเพิ่มเติม หากคุณกำลังเก็บข้อมูล 400 เมกะไบต์การเพิ่มความต้องการในการจัดเก็บเป็นสองเท่าไม่ใช่เรื่องใหญ่ แต่ถ้าคุณเก็บ 400 เทราไบต์ก็จะเริ่มมีความหมายเพิ่มขึ้นอีกเล็กน้อย การแปลงข้อมูล 400 เทราไบต์จาก (พูด) Shift-JIS เป็น UTF-x อาจใช้เวลาสักครู่เช่นกัน

สิ่งนี้จะกลายเป็นเรื่องยากโดยเฉพาะถ้าคุณมีการรับประกันความพร้อมใช้งาน (เช่น) รับประกันว่าฐานข้อมูลจะพร้อมใช้งานสำหรับทุกคนยกเว้น 10 นาทีจากปีใดก็ตามและคุณมีฐานข้อมูลที่อัปเดตหลายร้อยครั้งต่อวินาที โปรดทราบว่าคุณยังสามารถจัดการ Conversion ที่สำคัญในสถานการณ์เช่นนี้ได้ แต่ก็ไม่ใช่สิ่งที่จะต้องดำเนินการเบา ๆ ในบางกรณีอาจใช้เวลาหลายปีในการวางแผนให้พร้อมสำหรับการแปลง

หากคุณเริ่มต้นด้วยฐานข้อมูลที่ (เช่น) รองรับเฉพาะ ASCII อาจมีเหตุผลที่ดีที่จะโต้แย้งว่ามันสมเหตุสมผลที่จะเพิ่มการสนับสนุนการเข้ารหัสทั้งหมด - แต่ถ้าคุณสนับสนุนแล้วมีน้อยที่จะได้รับจากการลดลง สนับสนุนพวกเขา

โดยเฉพาะอย่างยิ่งโปรดทราบว่าคุณอาจได้รับอะไรข้างทางในการทำให้รหัสง่ายขึ้นหรืออะไรทำนองนั้น พวกเขายังคงต้องการรูทีนการแปลงทั้งหมดเพื่อจัดการกับการแปลงระหว่างไคลเอนต์และเซิร์ฟเวอร์ต่อไป ดังนั้นการทิ้งการสนับสนุนอาจหมายถึงการวางการเรียกฟังก์ชันหนึ่ง (เล็กน้อย) ในเส้นทาง "เขียนไปยังดิสก์" และ "อ่านจากดิสก์" แต่น้อย (ถ้ามี) หากคุณสนับสนุนการเข้ารหัสสองแผ่นบนดิสก์คุณจะไม่ได้รับสิ่งนั้น - คุณยังคงมีการเรียกใช้ฟังก์ชันที่นั่นดังนั้นสิ่งที่คุณต้องทำจริง ๆ ก็คือการ จำกัด ช่วงของการเข้ารหัสที่สนับสนุนโดยฟังก์ชันนั้น

อย่างน้อยถ้าฉันออกแบบสิ่งนี้ฉันอาจจะเขียน core ของฐานข้อมูลเพื่อทำงานใน UCS-4 แล้วมีรูทีนการแปลงระหว่าง core และ disk และระหว่าง core และผู้ใช้ ฉันต้องการใช้ชุดเดียวกันของการปฏิบัติในทั้งสองกรณีเพื่อให้ง่ายเส้นทางที่จะช่วยให้การจัดเก็บดิสก์ที่จะใช้ว่าชุดเดียวกันของการเข้ารหัสเป็นลูกค้าได้รับอนุญาตให้ใช้งาน


1
Shift-JIS ไม่ใช่การซิงโครไนซ์ตัวเองซึ่งทำให้การค้นหายุ่งยาก คุณจะได้รับความเรียบง่ายอย่างมีนัยสำคัญโดยไม่สนับสนุน
dan04

@ dan04: หากคุณมีรูทีนการค้นหา / การทำดัชนีที่พิสูจน์แล้วว่าเวลาสำหรับ Shift-JIS การเปลี่ยนเป็น UTF-8 หรือแม้แต่ UCS2 อาจช่วยปรับปรุงประสิทธิภาพได้เล็กน้อย สำหรับฐานข้อมูลใหม่คุณอาจเลือกการเข้ารหัสที่ดีกว่าสะดวกกว่าและสม่ำเสมอกว่าเช่น UCS2 หรือ UTF-16
9000

@ dan04: หากคุณสามารถหลีกเลี่ยงได้โดยไม่สนับสนุนเลยคุณจะได้รับเพียงเล็กน้อย ตราบใดที่คุณสนับสนุนมันมาจาก / ไปถึงลูกค้าคุณจะต้องติดอยู่กับความอัปลักษณ์ของมันส่วนใหญ่ ...
Jerry Coffin

5

มีปัญหาสองสามข้อในการจัดเก็บ UTF-8 บนเซิร์ฟเวอร์เท่านั้น:

  1. ขีด จำกัด ของVARCHAR(20)คอลัมน์คืออะไร นั่นคือ 20 ไบต์หรือ 20 "ตัวอักษร" (และใน Unicode สิ่งที่เป็น "ตัวอักษร" เมื่อคุณใช้การรวมตัวอักษรมัดและอื่น ๆ เข้าบัญชี?) CHAR(20)ที่จริงแล้วมันเกี่ยวกับที่ใดที่มันต้องสำรองพื้นที่ทั้งหมดที่เป็นไปได้: ฉันเชื่อใน MySQL มันสงวนจำนวน 4 เท่าของจำนวนไบต์สำหรับคอลัมน์ที่เข้ารหัส UTF-8 (80 ไบต์ดังนั้นCHAR(20)) เพื่อจัดการกรณีที่เลวร้ายที่สุด
  2. คุณต้องทำการแปลงการเข้ารหัสอย่างต่อเนื่องระหว่างการเข้ารหัสเซิร์ฟเวอร์และการเข้ารหัสลูกค้าของคุณ คุณสามารถยืนยันว่าคุณต้องการหยุดการสนับสนุนการเข้ารหัสไคลเอนต์หลายรายการเช่นกัน แต่ถ้าคุณไม่ทำเช่นนั้นสตริงทั้งหมดจะต้องถูกแปลงตลอดเวลา หากคุณสามารถจับคู่การเข้ารหัสเซิร์ฟเวอร์และการเข้ารหัสไคลเอนต์การแปลงไม่จำเป็น
  3. ตามที่คนอื่น ๆ ระบุไว้ UTF-8 ค่อนข้างมีประสิทธิภาพสำหรับการจัดเก็บข้อความภาษาอังกฤษ แต่ไม่มีประสิทธิภาพมากสำหรับภาษาอื่น - ภาษาเอเชียตะวันออกโดยเฉพาะ คุณสามารถอนุญาตให้ใช้ UTF-16 หรือ UTF-8 ได้ตามความเหมาะสม หรือบีบอัดข้อความ แต่นั่นทำให้การจัดทำดัชนีและการค้นหาไม่มีประสิทธิภาพ

ฉันเห็นด้วยกับคุณแล้ว: การเข้ารหัสแบบดั้งเดิมนั้นส่วนใหญ่ไม่มีจุดหมายและ Unicode นั้นเป็นการเข้ารหัสที่ดีที่สุดสำหรับการใช้งานใหม่ทั้งหมด ถ้าฉันกำลังเขียนเซิร์ฟเวอร์ฐานข้อมูลตั้งแต่ต้นวันนี้ฉันจะสนับสนุน Unicode เท่านั้นและไม่สนับสนุนการเข้ารหัสแบบเดิมเลย

ข้อแตกต่างคือ PostgreSQL และเซิร์ฟเวอร์ฐานข้อมูลอื่น ๆ ส่วนใหญ่ที่ใช้อยู่ในปัจจุบันมีอยู่ก่อนที่ Unicode จะเป็นตัวเลือกที่ทำงานได้ ดังนั้นพวกเขาจึงได้รับการสนับสนุนการเข้ารหัสแบบดั้งเดิม (แน่นอนพวกเขาไม่ได้รับมรดกมาก่อน) และไม่มีจุดใดที่ฉีกรหัสทั้งหมดออกไปด้วยเหตุผลทางอุดมการณ์


10
"แต่มันไม่มีประสิทธิภาพมากสำหรับภาษาอื่น - ภาษาเอเชียตะวันออกโดยเฉพาะ" แม้ในทางปฏิบัติ พิจารณาหน้านี้จีนวิกิพีเดีย แม้ว่ามันจะแสดงตัวอักษรจีนจำนวนมากที่น่ากลัว แต่ในแหล่งที่มาของหน้าอักขระ ASCII ก็สามารถทับได้เกือบ 7: 1
Joey Adams

2
หากคอลัมน์ N ใน CHAR (N) ของคุณเป็นส่วนหนึ่งของรูปแบบตัวระบุที่กำหนดไว้อย่างดี (เช่น VIN นั้นถูกกำหนดให้มีความยาว 17 ตัวอักษร) แสดงว่าอาจไม่จำเป็นต้องรวมอักขระหรือตัวยึด ถ้าไม่เช่นนั้น N เป็นเพียงข้อ จำกัด โดยพลการซึ่งควรตีความอย่างไม่เห็นแก่ตัวเพื่อหลีกเลี่ยงการตัดทอนข้อมูล
dan04

5
@Joey Adams: มันเป็นเรื่องจริงของ HTML และ XML ที่มาร์กอัปตัวเองทำขึ้นเป็นส่วนใหญ่ของข้อความ (และเป็นเหตุผลที่ฉันคิดว่า UTF-8 เป็นตัวเลือกที่ดีสำหรับเว็บ) แต่ในฐานข้อมูลที่คุณไม่ค่อยเก็บ HTML ในตอนท้ายของวันมันเป็นเพียงปัจจัยของความแตกต่างสอง (หรือน้อยกว่า) ซึ่งไม่มากจริง ๆ
Dean Harding

5
สัญลักษณ์หัวข้อ # 2 ในคำตอบนี้ไม่เกี่ยวข้อง: มันจะใช้หรือไม่ใช้ Unicode สัญลักษณ์แสดงหัวข้อ # 3 พูดเกินจริงอย่างไม่มีประสิทธิภาพและขอบเขตของมัน ในขณะเดียวกันคำตอบนี้เข้าใจปัญหาที่เกิดจากการเข้ารหัสแบบดั้งเดิมอย่างมากมาย มันง่ายที่จะสมมติว่าปัญหาไม่ใช่เรื่องใหญ่อะไรถ้าคุณใช้ชีวิตในอังกฤษเป็นภาษาอังกฤษ
Timwi

2
@Dean: ฉันไม่ทราบว่ามันไม่ได้รับอนุญาตให้แสดงความคิดเห็นในคำตอบโดยไม่ต้องโพสต์ของฉันเอง
Timwi

3

การเข้ารหัสที่ไม่ใช่สากล (และโดยเฉพาะไบต์เดียว) มีสถานที่: ในระบบที่:

  • มีหน่วยความจำไม่เพียงพอที่จะจัดเก็บฐานข้อมูลอักขระ Unicode
  • มีแบบอักษรไบต์เดียวฮาร์ดรหัสใน ROM
  • ไม่มีการเข้าถึงอินเทอร์เน็ตเพื่อให้แหล่งที่มาของไฟล์ที่เข้ารหัสแตกต่างกัน

วันนี้เป็นจริงสำหรับอุปกรณ์ฝังตัวบางประเภท แต่บนเดสก์ทอปและในห้องเซิร์ฟเวอร์, การเข้ารหัสที่ไม่ใช่ Unicode ควรจะยาวล้าสมัยโดยขณะนี้


3
ฉันเคยมีคอมพิวเตอร์ที่บ้านเช่นนั้น ฉันกำจัดพวกเขาส่วนใหญ่ในช่วงต้นยุค 80
David Thornley

2

UTF-8 ดีที่สุดสำหรับคุณผู้พูดภาษาอังกฤษที่เป็นกลาง1 หากคุณเป็นคนญี่ปุ่นตัวละครของคุณประมาณ 99% จะใช้เวลา 3-4 ไบต์แทนที่จะเป็นสองตัวใน UTF-16

ภาษาถิ่นที่ไม่ใช่ละตินประสบกับ UTF-8 ในระดับขนาดมาก อย่าลืมว่าภายในสองสามปีลูกค้าของคุณส่วนใหญ่อาจเป็นคนจีนและคนจีนมีตัวอักษรนับล้าน คุณไม่สามารถรักษามันไว้ได้อย่างมีประสิทธิภาพด้วย UTF-8

มิฉะนั้นผมเกลียดมันเมื่อฉันมีเอกสารข้อความที่ไม่อยู่ใน UTF- บางสิ่งบางอย่าง ฉันมักจะออกนอกเส้นทางของฉันถ้าฉันต้องการการเข้ารหัสที่เหมาะสม ในหนังสือของฉันการเข้ารหัสที่ไม่ใช่ Unicode นั้นตายแล้ว

1. อย่าเอาส่วนที่เห็นแก่ตัวเป็นการส่วนตัว ฉันต้องการสร้างภาพประกอบที่มีสีสันและฉันไม่ได้ตั้งใจ


3
@ Matthew - 4x มีขนาดใหญ่กว่า x 4 เท่า (สำหรับค่าบวก x) ฉันไม่เห็นว่าสัญกรณ์เชิงซีโมติกมีความเกี่ยวข้องที่นี่ ฉันไม่เคยเห็นโฆษณาบนฮาร์ดดิสก์ที่มีอัตราการเติบโตแบบซีมโทติค ขนาดปกติจะเหมือนเดิมตลอดอายุการใช้งานของไดรฟ์
Steve314

3
อักขระหลายล้านตัวจะไม่พอดีกับ Unicode จากบทความของ Wikipedia พบว่าในปัจจุบันมีตัวละครฮันประมาณหกหมื่นตัว เนื่องจาก Unicode ไม่ได้เป็นแค่ภาษาจีนเท่านั้นนั่นหมายความว่าตัวอักษรจีนจำนวนพอสมควรจะใช้สี่ไบต์ใน UTF-16 ซึ่งตราบใดที่ UTF-8 ได้รับในปัจจุบัน มันน่าสนใจที่จะเห็นสถิติความยาวของข้อความภาษาจีนใน UTF-8 และ UTF-16
David Thornley

6
@David:> 99% ของการเขียนภาษาญี่ปุ่นและจีนทั้งหมดใช้ตัวอักษรที่ต้องการเพียง 2 ไบต์ใน UTF-16 และ 3 ใน UTF-8 อักขระที่ต้องการมากกว่านั้นหายากมากและ / หรือมีประวัติ
Timwi

8
โปรดทราบว่าโดยทั่วไปภาษาญี่ปุ่นและจีนจะใช้อักขระน้อยกว่าตัวอักษรต่อคำ ฉันทำงานกับแอพที่มีไฟล์ภาษาขนาดใหญ่เป็นภาษาอังกฤษญี่ปุ่นและจีนทั้งหมดเข้ารหัสใน utf-8 จริง ๆ แล้วไฟล์ภาษาจีนมีขนาดเล็กที่สุดในขณะที่ไฟล์ภาษาญี่ปุ่นมีขนาดใหญ่กว่าต้นฉบับภาษาอังกฤษประมาณ 15%
Gort the Robot

3
เรื่องไร้สาระ สิ่งใดที่มีสองไบต์ใน UTF-16 จะไม่เกิน 3 ไบต์ใน UTF-8 สิ่งที่เป็นสี่ไบต์ใน UTF-8 คือ 4 ไบต์ใน UTF-16 ไม่มีตัวอักษรจีน "ล้าน" และแน่นอนว่าพวกเขาจะไม่พอดีกับ 16 บิต
gnasher729

1

ยูนิโค้ดเสียพื้นฐานและไม่น่าจะได้รับการแก้ไข มันต้องถูกแทนที่ด้วยสิ่งที่ดีกว่าสิ่งที่เป็นสากลอย่างแท้จริง หากมีสิ่งใดต้องการลดลงก็เป็น Unicode

ตัวอย่างปัญหาเกี่ยวกับ Unicide:

  • UTF8 เป็นแฮ็คที่สมเหตุสมผล แต่ซอฟต์แวร์ที่ใช้ UTF16 ส่วนใหญ่เสีย แอพ Windows ส่วนใหญ่ที่รองรับ Unicode ใช้ UTF16 รวมถึงระบบปฏิบัติการของตัวเอง ปัญหาที่พบบ่อยที่สุดไม่รองรับมากกว่าระนาบพื้นฐานเช่นตัวอักษรหลายคำ

  • การรวมกันของฮันเป็นหายนะที่ไม่ยอมแพ้ เป็นไปไม่ได้ที่จะผสมข้อความภาษาญี่ปุ่น / จีน / เกาหลีในเอกสารเดียวโดยไม่มีข้อมูลเมตาเพิ่มเติมและยากต่อการตรวจสอบว่าควรใช้แบบอักษรใด

  • ตัวละครผสมเป็นความหายนะอีกครั้ง รูปแบบการเข้ารหัสที่สมเหตุสมผลยิ่งขึ้นจะจับคู่อักขระหนึ่งตัวกับโค้ดเดียวซึ่งทำให้สตริงการประมวลผลมีสติค่อนข้างดี Unicode ไม่ Unicode นั้นไม่สอดคล้องกัน - ตัวอักษรฮั่นส่วนใหญ่เป็นชุดค่าผสม แต่ไม่ได้เข้ารหัสเช่นนี้โดยที่ตัวอักษรผสมของยุโรปนั้น

  • ชื่อของคนบางคนไม่สามารถเขียนได้อย่างถูกต้องใน Unicode หรือมีแนวโน้มสูงที่จะแสดงอย่างไม่ถูกต้องเนื่องจากปัญหาที่กล่าวถึงข้างต้น สิ่งนี้อาจมีผลกระทบรุนแรงเช่นเมื่อพยายามขึ้นเครื่องบินด้วยหนังสือเดินทางที่ไม่ตรงกับสิ่งที่พิมพ์ (ไม่ถูกต้อง) บนตั๋ว

เนื่องจากปัญหาเหล่านี้และอื่น ๆ ซอฟต์แวร์ที่ไม่ใช่ภาษาอังกฤษจำนวนมากไม่สามารถใช้ Unicode และอาศัยการเข้ารหัสอักขระท้องถิ่น นี่เป็นเรื่องปกติโดยเฉพาะอย่างยิ่งกับซอฟต์แวร์ญี่ปุ่นและจีน

ตามหลักแล้ว Unicode ควรถูกคัดค้าน การเข้ารหัสอักขระ TRON เป็นสิ่งที่ดีมากสำหรับ Unicode และสามารถใช้งานร่วมกับซอฟต์แวร์ที่มีอยู่ซึ่งไม่ได้รับการปรับปรุง


การอ้างสิทธิ์ของคุณว่าเป็นไปไม่ได้ที่จะผสมอักขระที่แตกต่างกัน (ญี่ปุ่น / เกาหลี / จีน) ดูเหมือนว่าจะล้าสมัยมาแล้วตั้งแต่ 15 ปีมาตรฐาน Unicode 3.2 ในปี 2002 Unicode สนับสนุนตัวเลือก Variation, codepoints ซึ่งหลังจาก codepoint han ระบุอย่างชัดเจน ควรจะแสดง นอกจากนี้ยังระบุอักขระ combinatorial เป็น "การรวมเครื่องหมายกำกับเสียง" ด้วยอักขระพื้นฐาน (a °) และร่ายมนตร์พิเศษ (å), กระบวนการแปลงให้เป็นตรงกันข้าม "การทำให้เป็นมาตรฐาน" ดังนั้นไม่ Unicode ไม่ได้ขาดพื้นฐาน
Thorsten S.

คุณแสดงข้อบกพร่องหลายอย่าง บางภาษาใช้ตัวอักษรผสม, บางอย่างไม่ได้และ Unicode ไม่สามารถตัดสินใจได้ว่าจะเลือกแบบไหน ดังที่ฉันได้ชี้ให้เห็นว่าซอฟต์แวร์ส่วนใหญ่ที่อ้างว่าสนับสนุน Unicode ไม่เข้าใจปัญหาเหล่านั้นอยู่แล้วและจะแสดงว่าผิดแม้จะมีตัวเลือก โปรแกรมเมอร์ไม่ควรคาดหวังว่าจะเป็นผู้เชี่ยวชาญด้านภาษาซึ่งเป็นข้อบกพร่องพื้นฐานอื่น ๆ ใน Unicode
ผู้ใช้

0

อาจจะเป็นการเขียน แต่ไม่ใช่สำหรับการอ่าน

มีเนื้อหาที่มีอยู่จำนวนมากที่ใช้การเข้ารหัสเหล่านั้นและการเข้ารหัสบางอย่างเช่น base64 ไม่ไปที่ใดก็ได้เพราะโปรโตคอลข้อความบางฉบับกำหนดให้เป็นวิธีในการฝังข้อมูลไบนารี

ปัญหาที่แท้จริงคือการตรวจจับการเข้ารหัสอัตโนมัติซึ่งนำไปสู่ช่องโหว่ด้านความปลอดภัย ฉันจะไม่รังเกียจที่จะเห็นการเข้ารหัสที่คลุมเครือเช่นUTF-7เพียงแค่หายไป

การตรวจจับอัตโนมัติยังมีแนวโน้มที่จะจัดการกับเนื้อหาที่สร้างขึ้นโดยการเรียงสตริงไบต์อย่างไร้เดียงสาอย่างไร้เดียงสา


7
Base64 ไม่ใช่การเข้ารหัสอักขระ
dan04

0

ฉันยอมรับได้ว่าการเข้ารหัสอักขระเริ่มต้นสำหรับฐานข้อมูลและแอปพลิเคชันใหม่ควรเป็นตัวแปร UTF บางประเภท ฉันจะเลือกใช้ UTF-16 เป็นการส่วนตัวเนื่องจากดูเหมือนจะเป็นการแลกเปลี่ยนที่สมเหตุสมผลเกี่ยวกับพื้นที่และความซับซ้อน (มากกว่า UTF-8) ที่กล่าวว่าการเข้ารหัสอักขระบางตัวยังคงสมเหตุสมผลในบางกรณี

  • หากคุณกำลังจัดเก็บ / ถ่ายโอนข้อความ base64 คุณจะต้องใช้ ASCII เท่านั้นและคุณสามารถทำได้ด้วยโปรโตคอลที่เข้ารหัส 7 บิตเช่นอีเมล ค่าใช้จ่ายเพิ่มเติมของ UTF-8 ไม่จำเป็น
  • ไฟล์และข้อมูลที่มีอยู่จำนวนมากถูกสร้างขึ้นจากการเข้ารหัสอักขระที่เก่ากว่าเหล่านี้ความสามารถในการอ่านเป็นสิ่งสำคัญ

โปรดทราบว่ามีอัลกอริทึมการทำให้เป็นมาตรฐาน UTF 4 แบบ หากคุณมีความกังวลเกี่ยวกับตัวละครหลาย codepoint คุณสามารถใช้หนึ่งในสองขั้นตอนวิธีการทำให้ปกติที่ยุบลงในตัวอักษรเดียว codepoint เทียบเท่า ความแตกต่างระหว่างพวกเขาจะทำอย่างไรกับความเท่าเทียมกันตรรกะกับความสมดุลทางกายภาพของตัวละคร


1
ผู้ลงคะแนนเสียงสามารถพูดได้ไหมว่าทำไมพวกเขาถึงลงคะแนนลง ?
Berin Loritsch

3
ฉันไม่ได้ลงคะแนน แต่จุดรวมทั้งหมดของ base64 คือการถ่ายโอนข้อมูลไบนารีลงในช่องข้อความ หากคุณสามารถเลือกการเข้ารหัสที่จะใช้ในช่องนั้นคุณจะไม่ใช้การเข้ารหัสข้อความเลย แม้ว่าช่องของคุณเป็น ASCII ธรรมดาจริงๆฐาน 64 ใช้เพียง 6 จาก 7 บิตซึ่งเป็นค่าใช้จ่ายที่สำคัญอยู่แล้ว
Steve314

ฉันหวังว่าบางคนไม่เพียงแค่อ่านสัญลักษณ์แสดงหัวข้อย่อย สิ่งเหล่านี้เป็นข้อยกเว้นสำหรับการใช้ UTF และคุณไม่ถูกต้องเกี่ยวกับฐาน 64 โดยใช้เพียง 6 จาก 8 ไบต์เท่านั้น ชุดอักขระ ASCII ชุดแรกคืออักขระควบคุมที่พิมพ์ไม่ได้ซึ่งบังคับให้อักขระบางตัวใน base64 ใช้ 7 จาก 8 ไบต์ มันจงใจหลีกเลี่ยงบิตสูงเพราะตัวละครเหล่านั้นไม่ได้รับประกันว่าจะมีอยู่ในทุกหน้ารหัสในขณะที่ตัวละครจาก 0-127 เป็น
Berin Loritsch

2
@Berin - (1) ไม่ แต่สิ่งที่ "ฉันเห็นด้วย" นั้นไม่มากนักหากไม่มีสัญลักษณ์แสดงหัวข้อย่อยและ (2) ฐาน 64 มี 64 "หลัก" 64 หลักคือ 6 บิตที่คุ้มค่าเพราะ 2 ^ 6 == 64 วิธีที่คุณนำเสนอว่าในพื้นที่โค้ด 7 บิต (หรือ 8 บิตหรือ 8 ไบต์ถ้าคุณต้องใช้) จะแยกจากข้อมูลที่มีอยู่จริง การหลีกเลี่ยงอักขระที่ไม่พิมพ์ ฯลฯ เป็นสาเหตุของค่าใช้จ่าย - ไม่ได้หมายความว่าไม่มีค่าใช้จ่าย เลือกช่องทางที่ออกแบบมาสำหรับข้อมูลไบนารีและค่าใช้จ่ายนั้นไม่มี
Steve314

3
โปรดทราบว่า base64 ถูกประดิษฐ์ขึ้นเพื่อจัดการกับการส่งข้อมูลไบนารีผ่านช่องทางข้อความอย่างเดียว เป็นที่ทราบกันว่าไม่มีประสิทธิภาพ (การขยายตัว 3: 4) แต่เกี่ยวข้องกับข้อ จำกัด ทางเทคนิคในตัวเลือกการขนส่งบางอย่าง มรดกจะเป็นอีเมลและฟอรัม UseNet แต่แอปพลิเคชันที่ทันสมัยกว่านี้จะทำการฝังข้อมูลไบนารีใน XML บางครั้งช่องที่เหมาะสมไม่มีอยู่และคุณต้องทำงานผ่านข้อ จำกัด ของช่องที่มีอยู่
Berin Loritsch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.