หลังจากเอา python-libthai ของวีร์มาใช้กับข้อมูลที่ได้มาจากเว็บ ก็พบปัญหาเรื่อง character encoding นิดหน่อย
libthai นั้นปัจจุบันทำงานกับข้อมูลที่เป็นภาษาไทย 8 บิตอยู่ (น่าจะเป็น TIS-620) ตัว python-libthai เลยมีขั้นตอนการแปลงจากยูนิโค้ดไปเป็น 8 บิตก่อน
ทีนี้ ปรากฏว่า encoder “CP874”, “TIS_620” และ “ISO8859_11” ของ Python มันดันแปลงตัวอักษรบางตัวไม่ได้ (เนื่องจากใน charset พวกนั้น มันไม่มีตัวอักษรดังกล่าว) โปรแกรมก็เลยจะตาย ถ้าไปเจออักษรพวกนั้น
ก่อนตายมันจะโวยทำนองว่า :
UnicodeEncodeError: 'charmap' codec can't encode character u'\u200b' in position 3560: character maps to <undefined>
วิธีแก้แบบถึก ๆ คือ เอาหูไปนาเอาตาไปไร่ซะ ignore มัน ด้วยการไปแก้ แฟ้มชื่อ libthai.c ของ python-libthai (แฟ้มนี้เป็น wrapper ที่ไปเรียก libthai ให้)
หาบรรทัดที่เรียกฟังก์ชั่น PyUnicode_Encode/Decode
แล้วแก้พารามิเตอร์ตัวที่สี่เป็น “ignore” ซะ
เช่น จาก
PyObject *txt_cp874 =
PyUnicode_Encode(s1, s1_len, "CP874", NULL);
tok =
PyUnicode_Decode(buffer, tok_len, "CP874", NULL);
เป็น
PyObject *txt_cp874 =
PyUnicode_Encode(s1, s1_len, "CP874", "ignore");
tok =
PyUnicode_Decode(buffer, tok_len, "CP874", "ignore");
แล้ว sudo python setup.py install ใหม่อีกรอบ (อย่าลืมล้าง build เก่าทิ้งก่อน) ก็น่าจะใช้ได้แล้วครับ
ลิงก์ : Python Unicode How-to
3 responses to “encode("UTF-8", "ignore") ข้าม ๆ เรื่องที่ทำไม่ได้ใน Python”
And I thought I was the sensible one. Thanks for setting me sraitght.
โอ้วว ปัญหาเกิดมากเลยครับ และมันจำเป็นต้องใช้มาก เพราะเกี่ยวกับฐานข้อมูล อยากให้ทำได้จริงๆครับ ถ้าหาวิธีได้จะมา ตอบใหม่นะครับ ผมนี่เงินสามทีเลย เฮ้อออออ!!! ถ้าไม่มีมาโพส ก็แปลว่าทำไม่ได้ จนปัญญาจริงๆๆ
decode(’tis-620′)