0

我正在尝试将 unicode 字符串写入 Python 中的文件,但是当我使用 linux“cat”或“less”读取文件时,没有写入正确的字符,而是显示为垃圾。

我正在从 Oracle 数据库中读取对象。当我打印类型时(其中 a 是数据库结果中的一行):

logger.debug(type(a[index])) 

它输出:

<type 'unicode'>

我打开文件进行写入,如下所示:

ff = codecs.open(filename, mode='w', encoding='utf-8')

我将这一行写入文件,如:

ff.write(a[index]))

但是当我读取输出文件时,它没有显示正确的重音字符而是垃圾:

$Bu��rger, Udo, -1985. Way to perfect horsemanship

如何正确地将 unicode 字符串对象写入 Python 中的文件?

4

1 回答 1

2

我可以猜到你是如何得到那个Mojibake 的字符串的。它非常复杂,让我印象深刻的是,这是多么糟糕。

将文本从字节解码为 Unicode error='replace',掩盖了错误的编解码器被使用的事实,因为无法识别的字节被替换字符替换。

然后将生成的带有U+FFFD REPLACEMENT CHARACTER代码点的 Unicode 文本编码为 UTF-8,但再次将它们解码为拉丁语 1,很可能由您的终端作为catles输出原始字节。

以这种方式编码的文本是:

>>> print u'$Bu��rger, Udo, -1985. Way to perfect horsemanship'.encode('latin1').decode('utf8')
$Bu��rger, Udo, -1985. Way to perfect horsemanship

大概这是Bürger, Udo , -ü 1985 :u

>>> text = u'Bu\u0308rger, Udo, - 1985. Way to perfect horsemanship'
>>> print text
Bürger, Udo, - 1985. Way to perfect horsemanship
>>> text.encode('utf8')
'Bu\xcc\x88rger, Udo, - 1985. Way to perfect horsemanship'
>>> text.encode('utf8').decode('ascii', errors='replace')
u'Bu\ufffd\ufffdrger, Udo, - 1985. Way to perfect horsemanship'

故事的寓意:除非您绝对确定自己在做什么,否则不要使用errors='replace'

于 2014-05-24T21:55:47.103 回答