周海汉 /文
2010.1.6
python版本,python 2.6+,wxpython 2.8+
问题提出
遇到wxpython 如何在windows下同时显示中文日文韩文越南拼音的问题。
windows下python如何显示utf8编码呢?
用notepad打开utf8编码的文件,韩文是框框,中文正常。
用chrome浏览器,不指定utf8编码对多字节显示有问题。指定utf8编码则能正确显示中文韩文等。
我需求的正是能同时显示的方法,不知浏览器是如何正确处理的。
数据文件和python源文件都是utf8。遇到中文能显示,但韩语显示为问号的问题。并不是读文件编码有问题,因为linux下并无问题。
问题可能原因
1.windows只支持GBK 或GB18030,对Unicode中的中日韩同时显示有问题?问题是浏览器已经解决了同时显示的问题。
2.python 在winfows下不支持unicode 0x10000以上的编码。而unihan 5.2库有大量0x20000以上的编码,是不是python本身的问题?
3.windows字库对unicode 5.2支持太有限,以致韩语要显示成?
4.我的数据文件utf8保存有问题?以致打开后没有正确解析?
除了第2点,其他都不是我碰到的问题的原因。
其实windows下显示CJK的问题,分command命令行、pythonIDLE控制台、pyqt,pygtk,wxpython,pytk等GUI。
命令行
cmd命令行下
u=unichr(0xc911)
print u
Traceback (most recent call last):
File “
UnicodeEncodeError: ‘gbk’ codec can’t encode character u’uc911’ in position 0:
illegal multibyte sequence
print u.encode(‘gbk’)
Traceback (most recent call last):
File “
UnicodeEncodeError: ‘gbk’ codec can’t encode character u’uc911’ in position 0:
illegal multibyte sequence
print u.encode(‘mbcs’)
?
显示为问号。
u必须经过encode才能打印,所以对CJK支持非常有限。因为gbk不能显示韩语等。同时命令行字体也对显示各国语言有限制。
IDLE
u=’일’
Unsupported characters in input
view plaincopy to clipboardprint?
-
u=u’일’
- Unsupported characters in input
-
u=u’일’.decode(‘gbk’)
- Unsupported characters in input
-
u=u’일’.decode(‘utf8’)
- Unsupported characters in input
-
u=’일’.decode(‘gbk’)
- Unsupported characters in input
-
u=’일’.decode(‘utf8’)
- Unsupported characters in input
-
u=unichr(0xc911)
-
print u
-
print u.encode(‘utf8’)
- Traceback (most recent call last):
- File “<pyshell#41>”, line 1, in
- print u.encode(‘utf8’)
- File “C:Python26libsite-packageswx-2.8-msw-unicodewx_core.py”, line 7845, in write
- self.__write(text)
- File “C:Python26libsite-packageswx-2.8-msw-unicodewx_core.py”, line 7850, in __write
- self.text.AppendText(text)
- File “C:Python26libsite-packageswx-2.8-msw-unicodewx_controls.py”, line 1850, in AppendText
- return controls.TextCtrl_AppendText(*args, **kwargs)
- UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x91 in position 2: incomplete multibyte sequence
-
print u.encode(‘gbk’)
- Traceback (most recent call last):
- File “<pyshell#42>”, line 1, in
- print u.encode(‘gbk’)
- UnicodeEncodeError: ‘gbk’ codec can’t encode character u’uc911’ in position 0: illegal multibyte sequence
-
u=u’일’ Unsupported characters in input »> u=u’일’.decode(‘gbk’) Unsupported characters in input »> u=u’일’.decode(‘utf8’) Unsupported characters in input »> u=’일’.decode(‘gbk’) Unsupported characters in input »> u=’일’.decode(‘utf8’) Unsupported characters in input »> u=unichr(0xc911) »> print u »> print u.encode(‘utf8’) Traceback (most recent call last): File “<pyshell#41>”, line 1, in
print u.encode('utf8') File "C:Python26libsite-packageswx-2.8-msw-unicodewx_core.py", line 7845, in write self.__write(text) File "C:Python26libsite-packageswx-2.8-msw-unicodewx_core.py", line 7850, in __write self.text.AppendText(text) File "C:Python26libsite-packageswx-2.8-msw-unicodewx_controls.py", line 1850, in AppendText return _controls_.TextCtrl_AppendText(*args, **kwargs) UnicodeDecodeError: 'gbk' codec can't decode byte 0x91 in position 2: incomplete multibyte sequence >>> print u.encode('gbk') Traceback (most recent call last): File "<pyshell#42>", line 1, in print u.encode('gbk') UnicodeEncodeError: 'gbk' codec can't encode character u'uc911' in position 0: illegal multibyte sequence >>>
wxPython GUI
开始发现wxPython GUI显示同时中日韩文也有问题,中文显示正确时,韩语等显示为问号。
经过研究,发现是wx.TextCtrl的SetValue方法调用的问题。
SetValue(str),str的编码最好是unicode,而不是具体的编码。
对str是utf8的字符串,应这样设置:
txtCtrl.SetValue(str.decode(‘utf8’))
我原来是这样写的:txtCtrl.SetValue(str.decode(‘utf8’).encode(sys.getfilesystemencoding()))
这样就导致在mbcs编码下,只显示中文,不显示韩文和越南文。
测试程序
view plaincopy to clipboardprint?
-
a = wx.App()
-
f = wx.Frame(None,-1,’test’)
-
t = wx.TextCtrl(f,-1)
-
t.SetValue(‘일’)
- Unsupported characters in input
-
t.SetValue(‘中’.decode(‘gbk’)+unichr(0xc911)+’xecxa4x91’.decode(‘utf8’))
-
f.Show()
a = wx.App() »> f = wx.Frame(None,-1,’test’) »> t = wx.TextCtrl(f,-1) »> t.SetValue(‘일’) Unsupported characters in input »> t.SetValue(‘中’.decode(‘gbk’)+unichr(0xc911)+’xecxa4x91’.decode(‘utf8’)) »> f.Show()
显示
中중중
于是,《汉字大全》可以发表0.7版了。
见http://code.google.com/p/hzdq
如非注明转载, 均为原创. 本站遵循知识共享CC协议,转载请注明来源