เหตุใด Windows 7 ทำงานกับ Unicode และไม่ใช้ UTF-8
คำศัพท์
UnicodeและUTF-8ไม่เหมือนกัน: Unicode เป็นชุดอักขระที่กำหนดชุดอักขระ (ละคร) และกำหนดหมายเลข (จุดรหัส) ให้กับอักขระแต่ละตัว UTF ‑ 8 เป็นหนึ่งในการเข้ารหัสหลายอย่างที่สามารถใช้เพื่อแสดงกระแสของอักขระ Unicode บนดิสก์หรือในการส่ง สตรีมอักขระ Unicode เดียวกันสามารถเข้ารหัสเป็น UTF ‑ 16, UTF ‑ 32 หรือ UTF ‑ 7 ได้เช่นกัน
อย่างไรก็ตาม Notepad มี "เข้ารหัส" ตัวเลือกทั้งANSI
, Unicode
, และUnicode big-endian
UTF-8
นักพัฒนาของ Microsoft ที่เขียนสิ่งนี้ใช้คำที่ผิด เมื่อพวกเขาพูดว่า "Unicode" พวกเขามักจะหมายถึง " UTF-16
little-endian " เมื่อพวกเขาพูดว่า "ANSI" พวกเขาหมายถึงรหัสหน้า 1252 (CP-1252)
Microsoft Notepad
ฉันเชื่อว่า Notepad ของ Microsoft เขียน UTF-16 ด้วยเครื่องหมายคำสั่งไบต์ ( BOM ) และ Notepad นั้นจะค้นหา BOM เมื่ออ่านไฟล์ข้อความ BOM บอกแอปว่าไฟล์นั้นเป็น UTF-16 และระบุว่าเป็นไฟล์ใหญ่หรือเล็ก
หาก Notepad ไม่พบ BOM จะเรียกใช้ฟังก์ชันไลบรารีIsTextUnicode
ซึ่งจะดูข้อมูลและพยายามเดาว่าจะใช้การเข้ารหัสแบบใด บางครั้งมันหลีกเลี่ยงไม่ได้ (เดาไม่ถูก) บางครั้งก็เดาได้ว่าไฟล์ "ANSI" เป็น "Unicode" การพยายามตีความไฟล์ UTF-16 หรือ UTF-8 เป็น Code Page 1252 จะทำให้ไฟล์นั้นแสดง glyphs ผิดและไม่สามารถค้นหา glyph เพื่อแสดงค่า 8 บิตได้จากนั้นจะแสดงเป็นช่องสี่เหลี่ยม
อย่างที่ harrymc พูดในคำตอบของเขามีทางเลือกที่ดีกว่าสำหรับ Notepad แต่ Notepad ช่วยให้คุณสามารถเลือกการเข้ารหัสอย่างชัดเจนเมื่อเปิดไฟล์ (แทนที่จะปล่อยให้ Notepad ลองเดา)
เครื่องหมายคำสั่งซื้อแบบไบต์
ตาม Unicode consortium เครื่องหมายคำสั่งซื้อไบต์ (BOM) เป็นตัวเลือก อย่างไรก็ตาม Windows พึ่งพา BOM เพื่อแยกความแตกต่างระหว่างการเข้ารหัสบางอย่าง
ดังนั้นโดยย่อไฟล์ของคุณอาจขาด BOM ด้วยเหตุผลบางอย่าง? บางที BOM อาจสูญหายไประหว่างกระบวนการอัปเกรดหรือไม่
หากคุณยังมีไฟล์ต้นฉบับที่แสดงเป็นกำลังสองคุณสามารถสร้างดัมพ์ของไฟล์เหล่านั้นเพื่อดูว่ามี BOM อยู่หรือไม่
มาตรฐานไฟล์ข้อความธรรมดา
ปัญหาคือไม่มีอย่างมีประสิทธิภาพ- ไม่มีมาตรฐานสากลสำหรับไฟล์ข้อความธรรมดา แต่เรามีจำนวนไม่เข้ากันและไม่ทราบจำนวนมาก
การทำเครื่องหมายจุดสิ้นสุดบรรทัดได้อย่างไร บางแพลตฟอร์มใช้ตัวควบคุม Carriage Return (CR) ตามด้วย Line Feed (LF) บางตัวใช้ CR คนเดียวและบางคนใช้ LF คนเดียว
เทอร์มินอลหรือตัวคั่นข้างต้นเป็นอย่างไร สิ่งนี้มีผลในตอนท้ายของไฟล์และเป็นที่ทราบกันดีว่าทำให้เกิดปัญหา
การปฏิบัติแท็บและอักขระควบคุมอื่น ๆ เราอาจสันนิษฐานว่ามีการใช้แท็บเพื่อจัดแนวความกว้างอักขระมาตรฐาน 8 ตัวจากจุดเริ่มต้นของบรรทัด แต่จริง ๆ แล้วไม่มีความแน่นอนในเรื่องนี้ หลายโปรแกรมอนุญาตให้เปลี่ยนตำแหน่งแท็บ
ชุดอักขระและการเข้ารหัส? ไม่มีมาตรฐานสากลสำหรับการระบุสิ่งเหล่านี้ถูกใช้สำหรับข้อความในไฟล์ สิ่งที่ใกล้เคียงที่สุดที่เราต้องมองหาคือการมี BOM ซึ่งบ่งบอกว่าการเข้ารหัสเป็นหนึ่งในสิ่งที่ใช้สำหรับ Unicode จากค่า BOM โปรแกรมที่อ่านไฟล์สามารถแยกความแตกต่างระหว่าง UTF-8 และ UTF-16 ฯลฯ และระหว่างรุ่น Little-Endian และ Big-Endian รุ่น UTF-16 เป็นต้นไม่มีมาตรฐานสากลสำหรับการระบุว่าไฟล์เป็น ถูกเข้ารหัสในการเข้ารหัสยอดนิยมอื่น ๆ เช่น CP-1252 หรือ KOI-8
และอื่น ๆ ไม่มีการเขียนข้อมูลเมตาข้างต้นลงในไฟล์ข้อความดังนั้นผู้ใช้จะต้องแจ้งโปรแกรมเมื่ออ่านไฟล์ ผู้ใช้ปลายทางต้องทราบค่าเมทาดาทาสำหรับไฟล์เฉพาะหรือเรียกใช้ความเสี่ยงที่โปรแกรมของพวกเขาจะใช้ค่าเมทาดาทาที่ไม่ถูกต้อง
บุชซ่อนข้อเท็จจริง
ลองสิ่งนี้บน Windows XP
- เปิด Notepad
- ตั้งค่าฟอนต์เป็น Arial Unicode MS (คุณอาจต้องติดตั้งก่อนถ้าไม่เห็นในเมนูให้คลิกที่ "แสดงแบบอักษรเพิ่มเติม")
- ป้อนข้อความ "Bush ซ่อนข้อเท็จจริง"
Save As
เลือก จากเมนูให้เลือกEncoding
ANSI
- ปิดแผ่นจดบันทึก
- เปิดเอกสาร (เช่นการใช้
Start
, My Recent Documents
)
- คุณจะเห็น畂桳栠摩琠敨獴獴獴獴獴獴獴獴獴獴獴獴獴獴獴獴獴獴獴獴
นี่แสดงให้เห็นว่าIsTextUnicode
ฟังก์ชั่นที่ใช้โดย Notepad อย่างไม่ถูกต้องเดาว่าข้อความ ANSI (จริงๆรหัสหน้า 1252) เป็น Unicode UTF-16LE โดยไม่มี BOM มี BOM ANSI
ในแฟ้มบันทึกเป็นไม่เป็น
วินโดว 7
ด้วย Windows 7, Microsoft ได้ทำการปรับIsTextUnicode
เพื่อไม่ให้เกิดปัญหาข้างต้น ในกรณีที่ไม่มี BOM ตอนนี้มีแนวโน้มที่จะคาดเดา ANSI (CP 1252) มากกว่า Unicode (UTF-16LE) ด้วย Windows-7 ฉันหวังว่าคุณจึงมากขึ้นน่าจะมีปัญหาย้อนกลับ: ไฟล์ที่มีตัวอักษร Unicode กับจุดรหัสมากกว่า 255 แต่ไม่มี BOM อยู่ในขณะนี้มีแนวโน้มที่จะคาดเดาว่าเป็น ANSI - และดังนั้นจึงแสดงไม่ถูกต้อง
การป้องกันปัญหาการเข้ารหัส
ปัจจุบันแนวทางที่ดีที่สุดดูเหมือนว่าจะใช้ UTF-8 ได้ทุกที่ เป็นการดีที่คุณจะเข้ารหัสไฟล์ข้อความเก่าทั้งหมดลงใน UTF-8 อีกครั้งและจะบันทึกไฟล์ข้อความเป็น UTF-8 เท่านั้น มีเครื่องมือเช่นrecodeและiconvที่สามารถช่วยได้