我有一个带有俄文文本的XML文件:
<p>все чашки имеют стандартный посадочный диаметр - 22,2 мм</p>
我使用xml.etree.ElementTree
以各种方式操作它(没有触及文本内容)。然后,我使用ElementTree.tostring
:
info["table"] = ET.tostring(table, encoding="utf8") #table is an Element
然后我用这个字符串做一些其他的东西,最后把它写到一个文件
f = open(newname, "w")
output = page_template.format(**info)
f.write(output)
f.close()
我在我的文件中结束了这个:
<p>\xd0\xb2\xd1\x81\xd0\xb5 \xd1\x87\xd0\xb0\xd1\x88\xd0\xba\xd0\xb8 \xd0\xb8\xd0\xbc\xd0\xb5\xd1\x8e\xd1\x82 \xd1\x81\xd1\x82\xd0\xb0\xd0\xbd\xd0\xb4\xd0\xb0\xd1\x80\xd1\x82\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xbf\xd0\xbe\xd1\x81\xd0\xb0\xd0\xb4\xd0\xbe\xd1\x87\xd0\xbd\xd1\x8b\xd0\xb9 \xd0\xb4\xd0\xb8\xd0\xb0\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80 - 22,2 \xd0\xbc\xd0\xbc</p>
如何正确编码?
答案 0 :(得分:1)
您使用
info["table"] = ET.tostring(table, encoding="utf8")
返回bytes
。然后你将它应用于一个格式字符串,这是一个str
(unicode),如果这样做,你最终会得到一个bytes对象的表示。
etree可以返回一个unicode对象,如果您使用:
info["table"] = ET.tostring(table, encoding="unicode")
答案 1 :(得分:0)
问题是ElementTree.tostring返回二进制对象而不是实际字符串。答案是:
info["table"] = ET.tostring(table, encoding="utf8").decode("utf8")
答案 2 :(得分:0)
试试这个 - 输出参数只是没有utf-8编码的俄语字符串。
import codecs
#output=u'все чашки имеют стандартный посадочный диаметр'
with codecs.open(newname, "w", "utf-16") as stream: #or utf-8
stream.write(output + u"\n")