Python 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

我正在使用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:
        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”)
您遇到了许多问题:

  • 您要么在Windows上,要么正在使用不正确的终端模拟将数据传输到Unix设备。您的终端错误地将多字节UTF-8字符转换为两个ISO-8895-*字符:

    Windows-1252/ISO-8895-*=
    Malm\xc3\xb6
    =
    Malmö

  • 如果您在Windows上,请不要在控制台上打印UTF-8。使用以下命令:

  • 打印前不要进行编码。让Python为您做这件事。如果Python出现问题,并且您在Unix上,请确保您的语言环境设置为UTF-8版本,例如
    en_US.UTF-8
    。如果所有其他操作都失败,请在您的环境中设置
    pythonionecoding=UTF-8

  • 除非您确实需要,否则不要将Unicode对象转换为str对象。如果这样做,请使用
    .encode(“utf-8”)
    而不是
    str()
    (它们都是
    str
    对象),以确保使用合适的编码。但是再一次,不要这样做

  • 如果需要将Unicode对象添加到文件中,请使用:

    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