Python 编解码模块
我正在尝试将一个保存为UTF-8格式的文件加载到Python(版本2.6.6)中,这个文件包含14种不同的语言。我使用Python的codecs
模块来解码这个文本文件。
import codecs
f = open('C:/temp/list_test.txt', 'r')
for lines in f:
line=filter_str(lines.decode("utf-8")
这一切都运行得很好。我解析了整个文件,然后想导出14个不同语言的文件。但我遇到的问题是我无法理解的。
我使用以下代码进行输出:
malangout = codecs.open("C:/temp/'polish.txt",'w','utf-8','surrogateescape')
for item in lang_dic['English']:
temp = lang_dic[lang1][item]
malangout.write(temp + '\n')
malangout.close()
举个例子:
- 语言:波兰语
- 预期输出:Dziennik zakłóceń
- 实际输出:Dziennik zak‚óceƒ
字符串是这样存储的:
u'Dziennik zak\u201a\xf3ce\u0192'
我尝试了很多Python文档中的编码(7.8 codecs)。在这个时候,任何信息都将对我有帮助。
1 个回答
1
这个字符串是原样存储的:
u'Dziennik zak\u201a\xf3ce\u0192'
这就成了一个问题,因为
In [25]: print(u'Dziennik zak\u201a\xf3ce\u0192')
Dziennik zak‚óceƒ
与
In [26]: print(u'Dziennik zak\u0142\xf3ce\u0144')
Dziennik zakłóceń
相比
In [28]: u'Dziennik zak\u201a\xf3ce\u0192'.encode('utf-8')
Out[28]: 'Dziennik zak\xe2\x80\x9a\xc3\xb3ce\xc6\x92'
所以看起来你存储的unicode是错误的。你确定在 C:/temp/list_test.txt
里的内容是正确的吗?也就是说,list_test.txt
里面是否包含
In [28]: u'Dziennik zak\u201a\xf3ce\u0192'.encode('utf-8')
Out[28]: 'Dziennik zak\xe2\x80\x9a\xc3\xb3ce\xc6\x92'
或者
In [27]: u'Dziennik zak\u0142\xf3ce\u0144'.encode('utf-8')
Out[27]: 'Dziennik zak\xc5\x82\xc3\xb3ce\xc5\x84'
?
附言:你可能想把
temp + '\n'
改成
temp + u'\n'
这样可以更清楚地表示你是把两个 unicode
加在一起形成一个新的 unicode
。上面这两行在Python2中结果是一样的,但在Python3中,把一个 unicode
和一个 str
加在一起会引发一个 TypeError
错误。虽然在Python3中,'\n'
是 unicode
,我认为在转向Python3时,最大的挑战是改变对混合使用 unicode
和 str
的思维方式。在Python2中,这种混合会默默地为你处理,而在Python3中则是不允许的。