【发布时间】:2015-07-08 17:38:43
【问题描述】:
我正在尝试写出一些文本,并尽可能使用以下代码将其编码为 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 字符串连接起来 - 它将它们都放入同一个字符串中,这会破坏事物。
【问题讨论】:
-
这里的
script_code和script_name是什么?你有一个解码错误,不是编码,所以一个或两个都是字节串,而不是unicode对象。 -
Unicode 字符串上的
.encode("utf-8")将始终有效,因为所有 Unicode 点都可以表示为 UTF8,因此在这种情况下errors='replace'是多余的。 -
接下来,这里的
outf是什么?你是怎么打开那个物体的?您的代码尝试解码字节串 as CP1252 是可疑的。对于隐式解码,这意味着您使用了sys.setdefaultencoding()(一个很大的禁忌),但如果outf不是一个常规的Python 2 文件对象,而是一个codecs或io文件对象,那将解释例外。 -
@MartijnPieters 我展示了我是如何打开 outf 的。 script_code 和 script_name 是从网页中抓取的字符串。
-
我认为如果他之前将
s = script_code + "," + (script_name or "") + "\n"放在行中,那将引发异常。
标签: python encoding utf-8 cp1252