Python 编解码模块

2 投票
1 回答
7350 浏览
提问于 2025-04-17 10:50

我正在尝试将一个保存为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时,最大的挑战是改变对混合使用 unicodestr 的思维方式。在Python2中,这种混合会默默地为你处理,而在Python3中则是不允许的。

撰写回答