尽管“errors ='replace'”,python utf-8编码抛出UnicodeDecodeError

时间:2015-07-08 17:38:44

标签: python encoding utf-8 cp1252

我正在尝试写出一些文本并尽可能使用以下代码将其编码为utf-8:

/Za

我收到以下错误:

outf.write((lang_name + "," + (script_name or "") + "\n").encode("utf-8", errors='replace'))

我认为编码调用的File "C:\Python27\lib\encodings\cp1252.py", line 15, in decode return codecs.charmap_decode(input,errors,decoding_table) UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 6: character maps to <undefined> 部分会处理它吗?

fwiw,我只是用

打开文件
errors='replace'

没有明确声明编码。

outf = open(outfile, 'w')

产生

print repr(outf) 

我将write语句分成单独的串联,编码和文件写入:

<open file 'myfile.csv', mode 'w' at 0x000000000315E930>

这是连接抛出异常。

字符串是outstr = lang_name + "," + (script_name or "") + "\n" encoded_outstr = outstr.encode("utf-8", errors='replace') outf.write(encoded_outstr)

print repr(foo)

进一步的侦探工作表明,我可以毫无困难地将其中任何一个与普通的ascii字符串连接起来 - 它将它们都放入破坏事物的同一个字符串中。

2 个答案:

答案 0 :(得分:2)

所以,问题在于你将bytestring 'G\xc4\x81ndh\xc4\x81r\xc4\xab'和Unicode字符串u'Kharo\u1e63\u1e6dh\u012b'连接在一起。

为了能够做到这一点,Python 2.7尝试使用其默认编码解码bytestring,将其转换为Unicode。我的默认编码是cp1252而不是ASCII,原因我无法从这里知道,但无论如何它都会失败,因为它是ASCII,因为该字符串是UTF8。

您最好的解决方案可能是通过改变变量获取这些值的方式来确保不会发生这种情况。

如果你不能,因为无论如何你在下一行编码为UTF8,它可能最容易编码script_name:

encoded_outstr = lang_name + b"," + (script_name.encode('utf-8') or b"") + b"\n"

请注意,我使用b","显式地使字符串文字字节串而不是Unicode字符串;如果您使用from __future__ import unicode_literals来兼容Python 3,那么默认情况下它们是Unicode,问题就会再次发生。

答案 1 :(得分:2)

当您连接字节字符串和Unicode字符串时,Python 2会尝试首先将字节字符串转换为Unicode。如果字节字符串包含\x80\xff范围内的任何非ASCII字符,则自动转换将因您显示的错误而失败。请注意,它显示的是can't decode,而不是can't encode - 这表示在您对encode的调用中发生 not 错误。

解决方法是使用正确的代码页自己将decode字节串转换为Unicode,以便串联的所有输入都是Unicode字符串。

outstr = lang_name.decode("utf-8") + u"," + (script_name or u"") + u"\n"