使用codecs.open()的Unicode解码错误

时间:2012-08-21 22:27:29

标签: python encoding utf-8 character-encoding

我遇到了如下字符编码问题:

rating = 'Barntillåten'
new_file = codecs.open(os.path.join(folder, "metadata.xml"), 'w', 'utf-8')
new_file.write(

"""<?xml version="1.0" encoding="UTF-8"?>
   <ratings>
        <rating system="%s">%s</rating>
   </ratings>""" % (values['rating_system'], rating))

我得到的错误是:

  File "./assetshare.py", line 314, in write_file
    </ratings>""" % (values['rating_system'], rating))

我知道编码错误与Barntillåten有关,因为如果我用test替换该字,则该函数可以正常工作。

为什么会发生此编码错误,我需要做些什么来解决它?

3 个答案:

答案 0 :(得分:3)

rating必须是Unicode字符串才能包含Unicode代码点。

rating = u'Barntillåten'

否则,在Python 2中,非Unicode字符串'Barntillåten'包含字节(用source encoding编码的任何字符编码),而不是代码点。

答案 1 :(得分:2)

在Python 2中,codecs.open期望读写unicode个对象。您正在通过str

修复方法是确保您传递的数据为unicode

new_file.write((

"""<?xml version="1.0" encoding="UTF-8"?>
"""<ratings>
        <rating system="%s">%s</rating>
   </ratings>""" % (values['rating_system'], rating)
).decode('utf-8'))

如果您使用unicode文字(u"..."),那么Python会尝试确保所有数据均为unicode。这里只有rating = u'Barntillåten'

就足够了
rating = u'Barntillåten'
new_file = codecs.open(os.path.join(folder, "metadata.xml"), 'w', 'utf-8')
new_file.write(

"""<?xml version="1.0" encoding="UTF-8"?>
"""<ratings>
        <rating system="%s">%s</rating>
   </ratings>""" % (values['rating_system'], rating))

您可以将codecs.open文件写入str对象,但前提是str以默认编码进行编码,这意味着为安全起见,这只是安全的如果str是纯ASCII。默认编码是,应该保留为ASCII;见Changing default encoding of Python?

答案 2 :(得分:1)

您需要使用unicode文字。

u'...'
u"..."
u'''......'''
u"""......"""