蟒UTF-8编码抛出的UnicodeDecodeError尽管“错误=‘替换’”(python ut

2019-10-23 17:26发布

我试着写了一些文字,并对其进行编码为UTF-8在可能情况下,使用下面的代码:

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>

我认为errors='replace'我的编码调用的一部分会处理这个问题?

FWIW,我只是打开与文件

outf = open(outfile, 'w')

没有明确声明的编码。

print repr(outf) 

生产:

<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)

lang_name: 'G\xc4\x81ndh\xc4\x81r\xc4\xab'
script_name: u'Kharo\u1e63\u1e6dh\u012b'

进一步的侦查工作发现,我可以连接那些纯ASCII字符串中的任何一个没有任何困难 - 这是把他们两个到是摔东西相同的字符串。

Answer 1:

那么,问题是,你是串接字节串'G\xc4\x81ndh\xc4\x81r\xc4\xab'和Unicode字符串u'Kharo\u1e63\u1e6dh\u012b'

为了能够做到这一点,Python 2.7版试图使用它的默认编码,将其转换成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的默认,而且只会再次出现问题。



Answer 2:

当你连接一个字节字符串和Unicode字符串,Python 2中首先尝试的字节串为Unicode转换。 如果字节字符串包含在范围内的任何非ASCII字符\x80\xff ,自动转换将失败,您显示错误。 请注意,它说can't decode ,不是can't encode -这表明,在您的来电没有发生错误encode

解决的办法是decode的字节串自己成Unicode,使用正确的代码页,使所有的输入串联是Unicode字符串。

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


文章来源: python utf-8 encoding throws UnicodeDecodeError despite “errors = 'replace' ”