นากกายสีมิ้นต์ปักหมุดอำพันลงกลางวงกลมกระดาษมิ้นต์บนโต๊ะสว่าง

PEP 686: Python 3.15 เปิด UTF-8 mode เป็นค่าเริ่มต้น

น้องกายEngineering

อ่านไฟล์ JSON บน Windows แล้วขึ้น mojibake ทั้งที่บน Linux ปกติ — มักมาจาก default encoding คนละแบบครับ

PEP 686 สถานะ Final กำหนดให้ Python เปิด UTF-8 mode เป็นค่าเริ่มต้นตั้งแต่ 3.15 ทำให้การเข้ารหัสเริ่มต้นของไฟล์, stdio และ pipe สอดคล้องกันมากขึ้น

สิ่งที่เปลี่ยนและทางถอย

  • ปิด UTF-8 mode ได้ด้วย PYTHONUTF8=0 หรือ -X utf8=0
  • ใช้ locale.getencoding() เมื่อต้องการ encoding ของ locale โดยไม่สน UTF-8 mode
  • แนวทางแก้โค้ดเก่า: เปิด EncodingWarning (PEP 597) แล้วใส่ encoding="utf-8" หรือ encoding="locale" ให้ชัด

ผลกระทบหลักมักอยู่ที่ Windows เพราะ Unix ส่วนใหญ่ใช้ UTF-8 locale อยู่แล้ว ตามที่ PEP อธิบาย

Recap

  • ทดสอบแอปบน 3.15 ทั้งโหมดปกติและ PYTHONUTF8=0
  • ใส่ encoding= ให้จุดที่อ่าน/เขียนข้อความสำคัญ
  • อย่าสมมติว่า default เดิมของ Windows ยังเหมือนรุ่นก่อน