我尝试写一个"字符串"到文件并获取以下错误消息:
UnicodeEncodeError: 'ascii' codec can't encode character u'\xcd' in position 6: ordinal not in range(128)
我尝试了以下方法:
print >>f, txt
print >>f, txt.decode('utf-8')
print >>f, txt.encode('utf-8')
它们都不起作用。我有相同的错误消息。
编码和解码背后的想法是什么?如果我有一个unicode对象,我可以直接将它写入文件,还是需要将其转换为字符串?
如何找出使用的编码?我怎么知道它是utf-8还是ascii还是别的什么?
ADDED
我想我已经设法将字符串保存到文件中。 print >>f, txt
以及print >>f, txt.decode('utf-8')
不起作用,但print >>f, txt.encode('utf-8')
有效。我没有收到任何错误消息,我在文件中看到了中文字符。
答案 0 :(得分:3)
我最近发布了another answer来解决这个问题。关键报价:
为了更好地理解差异,请阅读one of Joel's articles,但要点是字节是,字节(8位的组,没有任何其他含义),而字符是构成字符串的东西的文字。 编码将字符转换为字节,解码将字节转换回字符。
在Python 2中,unicode
个对象是字符串。常规str
对象可以是字符串或字节串。 (专业提示:使用Python 3,它可以更容易地跟踪。)
您应该将字符字符串(不是字节字符串)传递给print
,但您需要确保这些字符串可以由编解码器编码(例如ASCII或UTF-8)与目标文件对象f
相关联。作为输出过程的一部分,Python会为您编码字符串。如果字符串包含无法由文件对象的编解码器编码的字符,则会出现类似于您所看到的错误。
如果不知道txt
对象中的内容,我可以更具体。
答案 1 :(得分:1)
我认为您需要使用编解码器库:
import codecs
file = codecs.open("test.txt", "w", "utf-8")
file.write(u'\xcd')
file.close()
工作正常。
编码/解码的故事:
过去,计算机中只有大约60个字符可用(包括大写和小写字母+数字+一些特殊字符)。因此,只有1个字节足以为每个字母分配一个唯一的编号。将数字分配给字母以存储在存储器中称为编码。默认情况下,在python中使用的这个单字节编码名为ASCII
。
随着世界上计算机的发展,我们需要在计算机中拥有更多的字母和字符。所以1个字节是不够的。出现了不同的编码方案Unicode是其中一个着名的。您尝试存储在文件中的字符是Unicode字符,它需要2个字节,因此您必须向Python明确指出您不想使用默认编码,即ASCII(因为您需要2个字符)这个字符的字节数)。