python utf-8编码抛出UnicodeDecodeError尽管 "errors = '替换'“

标签 python encoding utf-8 cp1252

我正在尝试写出一些文本并尽可能将其编码为 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/

相关文章:

python - Django-对 admin 所做的更改不会在不重新启动服务器的情况下反射(reflect)在模板中

cocoa - NSFileManager contentOfDirectoryAtPath 与 samba 路径的编码问题

java - Eclipse 中的 Unicode 字符

java - 编码测试在 Ant 中失败但在 Eclipse 中有效

javascript 正则表达式支持带有数字和字母的 UTF8 字符

Python pip install h5py 遇到 TypeError : unsupported operand type(s) for -=: 'Retry' and 'int'

python - Python 2.7.8 的默认编码是什么?

python - 尝试使用 python 2 枚举/循环字母表、数字等

ios - URLSession.shared.dataTask 无法下载带有瑞典网址的图像

php - 使用 PHP 处理 GET 参数中的 unicode 值