ปัญหาการ Decode ภาษาไทย

ลอง decode ภาษาไทยเช่น ‘ก’.decode(‘utf-8’) แล้วได้

>>> 'ก'.decode('utf-8')
 
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    'ก'.decode('utf-8')
  File "C:\Python25\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa1 in position 0: unexpected code byte

แต่ถ้าเป็น iso-8859-11 tis-620กลับได้

ท่านใดเคยเจอบ้างครับ ผมลองบนวินโดว์หนะครับ

veer's picture

ขึ้นอยู่กับว่าตั้งค่าที่ terminal ให้ใช้ encoding อะไรครับ.

ถ้าได้แบบข้างล่างแสดงว่า terminal เป็นอะไรประมาณ TIS-620

>>> "ก"
'\xa1'

แต่ถ้าออกมาแบบที่สองนี้ก็น่าจะเป็นเป็น UTF-8

>>> "ก"
'\xe0\xb8\x81'

ถ้ามันออกมาแบบแรกแล้วสั่ง “ก”.decode(“UTF-8”) แล้วเจ๊งก็ถูกแล้วเพราะมันไม่ใช่ UTF-8 :-)

ถ้าเกิดไม่ได้ใช้ Interactive console มันก็จะไปขึ้นอยู่กับว่าเลือกตอน save (ใน editor) เป็นอะไรแทน

ผมลองกับ IDLE หนะครับ

ขึ้นอยู่กับว่าตั้งค่าที่ terminal ให้ใช้ encoding อะไรครับ.

ผมเข้าใจว่า UTF-8 น่าจะได้ทั้งหมด แต่มันไม่ได้แฮะ แปลกดี เนื่องจากว่าถ้าเราไม่รู้ encoding ก็ควรจะเดาว่าเป็น utf-8 แล้วแบบนี้จะเดาว่าไรดีเนี่ย

อันนี้มัน issue ของ django หนะครับ จริงๆแล้วมันสามารถตั้งค่าได้ว่าจะให้ใช้ encoding แบบไหน แต่มันกลับไม่ใช้ในตอนที่ instantiate request object ซะงั้น

อันนี้เป็นลิงค์ที่คุยกัน http://groups.google.com/group/django-users/browse_thread/thread/be82b5a3868a760a#

ใช้

sys.getdefaultencoding()

ได้หรือเปล่า?

sugree's picture

ปัญหาคือ windows ไม่ใช่ utf-8

ปัญหาคือ windows ไม่ใช่ utf-8

นี่แหละปัญหาครับ แปลกมากๆ และที่สุดยอดมากๆ ก็คือ python default encoding ของ window คือ ascii ครับ สุดท้ายก็ต้องเดาซักทาง แต่ถ้าคิดได้ตอนนี้น่าจะใช้ settings เข้าช่วย ประมาณว่าเราต้องรู้ encoding และก็แปลงกันตั้งแต่ต้น

sugree's picture

เพราะวินโดส์ไม่ใช่ utf-8 ถ้าจะให้ทำเป็น utf-8 ก็ดูจะฉลาดเกินไป

ที่ต้นไฟล์ manage.py

# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
del(sys)

และใส่

# -*- coding: utf-8 -*-

ที่ต้นไฟล์ทุกๆ ไฟล์ที่เหลือ

ใน web reportlab ก็คุยเรื่องนี้อยู่เหมือนกัน (บน windows ด้วย) http://www.reportlab.com/i18n/python_unicode_tutorial.html

อย่าลืม set editor ให้ใช้ encoding เป็น utf-8

ปัญหาคือมันใช้ utf-8 แล้วมัน decode ไม่ได้หนะครับ ไม่ไช่ว่ามันตั้งค่า encoding ไม่ได้ แล้วที่ไม่ได้ก็ไม่ได้เป็นบางภาษา ตอนนี้ทาง django เองก็ยังไม่แก้ ประมาณว่าถ้ามี url ที่ decode ไม่ได้มันจะให้ 400 django fails on defective unicode strings appearing in the url หนะ

ข้างล่างคือที่ผมเสนอไปให้ทาง django ดู

\app\settings.py
DEFAULT_CHARSET = 'tis-620'
 
\django\core\handlers\wsgi.py",
line 78, in __init__
    self.path = force_unicode(environ['PATH_INFO'])
 
change it to,
    self.path = force_unicode(environ['PATH_INFO'], encoding=settings.DEFAULT_CHARSET)   
sugree's picture

อืม ปัญหานี้มันเกิดจากสิ่งที่ไม่ใช่ unicode แปลว่าเยอรมันก็ยังไม่ปรับมาใช้ utf-8 เหมือนกัน

กำลัง setup test environment จะได้ลองมั่ง ใช้ django จาก trunk?

ลองทดสอบบน Windows XP Home ตั้ง Region เป็นประเทศไทย Language เป็นไทย ด้วย Django จาก Trunk และ Python-2.5.2

  • แบบไม่บังคับ manage.py ให้ใช้ utf-8 (ดังนั้นค่า default encoding ของ windows คือ ascii) Win32-Default
  • แบบบังคับ manage.py ให้ใช้ utf-8 ผม copy ไฟล์เดิมเป็นไฟล์ใหม่ชื่อ umanage.py Win32-Default
  • ลอง download โปรแกรมผมไปลองดูก็ได้ครับ utest.zip

ลอง

http://localhost/test1/กา

บน firefox

on firefox

แบบบังคับให้ใช้ utf-8 เป็น default ก็ให้ผลเหมือนกัน คือใช้ได้ทุกกรณี ลองกับภาษาอื่นก็เหมือนกัน ข้างล่างลองใส่ Traditional Chinese เข้าไปที่ URL Traditional Chinese Many Languages

ย้าย Codenone

ประกาศย้าย Codenone ไปใช้ Forum ของ Blognone แทนครับ ตามไปตั้งกระทู้ต่อได้ที่ Codenone Forum (รายละเอียดอ่านจากกระทู้ ย้าย Codenone ไปรวมกับ Blognone)

กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น