我遇到了如下字符编码问题:
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
替换该字,则该函数可以正常工作。
为什么会发生此编码错误,我需要做些什么来解决它?
答案 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"""......"""