我正在尝试写出一些文本并尽可能将其编码为 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 字符串连接起来 - 它将它们放入同一个字符串中,这会破坏事物。
最佳答案
因此,问题在于您正在连接字节串 '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,问题会再次发生。
关于python utf-8编码抛出UnicodeDecodeError尽管 "errors = '替换'“,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31299828/