Python UTF-8编码错误表示法
我正在使用Python2.7.X。我加载了一些XML,XML是utf-8编码的。因此,我做了以下工作:Python UTF-8编码错误表示法,python,encoding,utf-8,Python,Encoding,Utf 8,我正在使用Python2.7.X。我加载了一些XML,XML是utf-8编码的。因此,我做了以下工作: def get_xml(self): r = requests.get("https://dataserver.com") xml = r.text return xml.encode("utf-8") def parse_xml(xml): tree = ET.fromstring(xml) for child in tree: pr
def get_xml(self):
r = requests.get("https://dataserver.com")
xml = r.text
return xml.encode("utf-8")
def parse_xml(xml):
tree = ET.fromstring(xml)
for child in tree:
print " Raw type = " + str(type(child.attrib["name"]))
print "Encoded type = " + str(type(child.attrib["name"].encode("utf-8")))
print child.attrib["name"].encode("utf-8")
print str(child.attrib["name"])
print "------------"
这将导致以下错误:
Raw type = <type 'unicode'>
Encoded type = <type 'str'>
Malmö FF - Paris SG
Traceback (most recent call last):
...
UnicodeEncodeError: 'ascii' codec can't encode characters in position 4-5: ordinal not in range(128)
原始类型=
编码类型=
马尔姆FF-巴黎SG
回溯(最近一次呼叫最后一次):
...
UnicodeEncodeError:“ascii”编解码器无法对位置4-5中的字符进行编码:序号不在范围内(128)
因此,UnicodeEncodeError
对我来说是清楚的。但是,在将unicode
字符串编码为utf-8
字符串后,我希望它能够正确表示。也就是说,MalmÃFF
实际上应该是MalmöFF
我做错了什么?我认为您的表达式
str(child.attrib[“name”])
将使用标准编码来编码unicode。您确定这已设置为utf-8吗?我猜你把它设定在拉丁语-1或别的什么。尝试将其重写为child.attrib[“name”].encode(“utf-8”)
您遇到了许多问题:
Malm\xc3\xb6
=Malmö
en_US.UTF-8
。如果所有其他操作都失败,请在您的环境中设置pythonionecoding=UTF-8
.encode(“utf-8”)
而不是str()
(它们都是str
对象),以确保使用合适的编码。但是再一次,不要这样做
my_f = io.open("myfile.txt", "w", encoding="utf-8")
my_f.write(my_unicode_object)
Unicode对象将为您编码
谢谢你的建议。然而,我100%肯定它是UTF-8。另外,
print“Latin-1 Encoded type=“+str(type(child.attrib[“name”]).encode(“Latin-1”))
也会导致错误。当您已经编码了某些内容时,不需要强制转换到str
。它将是一个具有特定编码的字节字符串。我仍然建议你尝试我建议的重写,只是为了确定。你确定你的建议没有打字错误吗?您建议child.attrib[“name”].encode(“utf-8”)
。我已经这么做了好吧,你说得对。它确实是latin-1
编码的。这很奇怪,因为xml编码被显式设置为utf-8
,我是说在for child in tree
循环中,您的第四个打印
。它没有编码,在您强制转换str
之前将使用unicode,然后python将尝试将其编码为默认编码。在你的例子中,拉丁语-1。谢谢你的这些观点。仅供参考:我正在使用Mac OS X Yosemite和标准的苹果终端应用程序。我的区域设置都设置为包含UTF-8
的内容。我仍然不明白为什么这些字符串用拉丁语1编码?苹果终端有一个模拟设置。它应该设置为UTF-8,但可能已更改。转到“首选项”->“配置文件”->“高级”。请记住停止调用.encode()
和str()
。嗯,终端被设置为UTF-8I可以复制MalmÃ
,如果我将模拟错误地设置为“Windows-1252”。如果您删除.encode()
,它还会这样做吗?好吧,我的终端设置为UTF-8,并且打印的输出“不带str()或编码(…):”+child.attrib[“name”]
是不带str()或编码(…):MalmÃFF-Paris SG