Windows 7 UTF-8 และ Unicode


14

มีคนช่วยอธิบายสิ่งที่เปลี่ยนแปลงใน Windows 7 (Pro 64 บิต) ได้ไหม

รายละเอียด: ก่อนหน้านี้ฉันมี Windows XP และมีไฟล์การแปลบางส่วน (เข้ารหัส UTF-8) ในรูปแบบ CSV ฉันสามารถดูฟอนต์ทั้งใน Notepad และ Excel หลังจากอัปเกรดเป็น Windows 7 เมื่อฉันเปิดไฟล์เหล่านี้ - สิ่งที่ฉันเห็นคือกล่องสี่เหลี่ยม (แค่คุณรู้ว่าถ้าฉันเปิดมันในเบราว์เซอร์ - ฉันสามารถเห็นการแปลทั้งหมด) ถ้าฉันบันทึกไฟล์เหล่านั้นใน Unicode ทุกอย่างดูเหมือนจะไม่เป็นไร

แล้วเกิดอะไรขึ้นกันแน่? เหตุใด Windows 7 ทำงานกับ Unicode และไม่ใช้ UTF-8

คำตอบ:


30

เหตุใด 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เลือก จากเมนูให้เลือกEncodingANSI
  • ปิดแผ่นจดบันทึก
  • เปิดเอกสาร (เช่นการใช้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ที่สามารถช่วยได้


3
ตามที่ Wikipedia : ใน Windows Vista และ Windows 7 [.. ] IsTextUnicode ได้รับการเปลี่ยนแปลงเพื่อให้มีความเป็นไปได้มากกว่าที่จะคาดเดาการเข้ารหัสแบบไบต์ - เบสมากกว่า UTF-16LE
Arjan

ใช่แน่นอนว่าไฟล์เหล่านั้นมี BOM เนื่องจากเราสร้างไฟล์เหล่านั้นด้วย BOM เป็นที่น่าสนใจว่า Windows 7 ไม่ได้อ่าน BOM ที่สร้างขึ้นโดยระบบปฏิบัติการรุ่นเก่า
Sha Le

BOM ไม่ได้เปลี่ยน อาจเป็นได้ว่าไฟล์ของคุณไม่มี BOM แต่ก่อนหน้านี้รูปแบบเริ่มต้นคือตัวแปร Unicode บางตัวซึ่งตอนนี้เป็น ASCII ดูคำตอบของฉัน
harrymc

@Sha Le: หากไฟล์มี BOM, Windows 7 Notepad ควรเปิดอย่างถูกต้องดังนั้นปัญหาที่คุณอธิบายไม่ตรงกับปัญหาที่isTextUnicodeทราบ คุณสามารถสร้างไฟล์ตัวอย่างขนาดเล็กที่แสดงปัญหาที่คุณมีกับไฟล์ที่มี BOM ได้หรือไม่?
RedGrittyBrick

นอกจากนี้ยังthis app can breakมีผลเช่นเดียวกับBush hid the facts
Regent

3

ข้อสังเกต: คุณสามารถใช้Notepad ++เพื่อดูไฟล์เหล่านี้โดยใช้เมนูการเข้ารหัส

เมื่อไฟล์ถูกแสดงอย่างถูกต้องแล้วการบันทึกจะเพิ่ม BOM ที่ถูกต้อง


ฉันรู้ว่าโพสต์นี้ค่อนข้างเก่า แต่ปัจจุบันฉันมีปัญหากับ win 7 และ notepad ++ ไม่แสดง UTF 8 ที่ไม่มี BOM เมื่อไฟล์ถูกสร้างครั้งแรกโดยใช้ notepad ++ v5.9.6.2
เจค

@Jake: ตรวจสอบว่าเมนูการเข้ารหัสแสดง "Encode in UTF8" แทนที่จะเป็น "Encode in UTF8 ที่ไม่มี BOM"
harrymc

1

ใน Windows 10 เป็นไปได้ (ทดสอบกับรุ่น 1903)

  1. คัดลอกไฟล์ของคุณกับการเข้ารหัสที่ดีไปTXTUTF-8.txtC:\WINDOWS\SHELLNEW
  2. ในHKEY_CLASSES_ROOT\.txt\ShellNewการสร้างห่วงโซ่ใหม่ที่มีชื่อ " FileName"
  3. เปลี่ยนค่าของ " FileName" เป็น " TXTUTF-8.txt"

ตอนนี้เมื่อคุณสร้างไฟล์ txt ใหม่โดยใช้เมนู Windows มันจะTXTUTF-8.txtเป็นเทมเพลตของคุณ

ที่มา: https://answers.microsoft.com/fr-fr/windows/forum/all/configurer-lencodage-par-d%C3%A9faut-en-utf-8-dans/9c0358ca-a2b3-43e8-a154- d10c1fe94317

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