29 พฤศจิกายน 2558

ว่าด้วยเรื่อง Unicode

จากเมื่อวานต้องเขียนโปรแกรมดึงข้อมูลจาก mdb (Microsoft Jet ที่เราชอบเรียก MS Access File) ที่เขียนไว้ใช้กับ VB6 ตั้งแต่สมัย Windows 98 แปลงมาเป็น SQLite3 เพื่อให้ใช้ได้ทุก Platform ด้วยโปรแกรมที่เขียนด้วย Python จากข้อมูลเดิม Text เป็น ASCII Windows 874 ต้องมาใช้ Unicode ที่ SQLite รองรับ

เพราะต้องการจะเขียนให้จบเร็วจึงตัดสินใจใช้วิธีแปลงข้อมูลใน Table ของ MS Access เป็น SQL command (INSERT INTO) ลง Text File เพื่อเรียกใช้โดย sqlite3.exe command line จากโครงการ SQLite อีกทีหนึ่ง

ปัญหาคือแม้บอกว่าเป็น Unicode แต่ Unicode ก็ไม่ได้มีแบบเดียว มี UTF-8 และ UTF-16 แล้ว UTF-16 ยังมีแบบ Little Endian และ Big Endian อีก อย่างไรก็ตามโปรแกรมที่ทำการแปลงข้อมูลต้องทำบน Windows เพื่อให้คนอื่นใช้ บน Windows x86 เก็บ Character บน Memory เป็น 16 bit Little Endian

ทดลองเขียนไฟล์เป็น UTF16LE ก็ปรากฏว่า sqlite3.exe อ่านได้ แต่เก็บข้อมูลภาษาไทยผิด ทั้งที่จากการตรวจสอบไฟล์ SQL statement เปิดด้วย Text Editor ก็อ่านถูก เลยตัดสินใจเปลี่ยนเป็น UTF-8 ซึ่งต้องเปลี่ยน Library ด้วย เขียนแล้วก็เปิดด้วย Text Editor แสดงเป็น UTF-8 ได้ แต่ sqlite3.exe อ่านไม่ผ่าน เหมือนว่าไม่รู้จัก 3 byte แรก อะไรหว่า

ก็พบว่า UTF-8 Text File ก็ยังมี 2 แบบอีกคือ แบบมี BOM (Byte Order Mark) กับไม่มี ซึ่ง sqlite3.exe ต้องไม่มี เลยต้องตัด 3 byte แรกออกและเขียนเป็น Binary ลง Text File (ห้ามงง) ถึงจะผ่านฉลุย

อยากรู้ว่าทำไมชีวิตกับ Unicode ถึงอยู่ยากจัง