Python搞乱了斯堪的纳维亚字符(Ö;->;Ã;)

Python搞乱了斯堪的纳维亚字符(Ö;->;Ã;),python,encoding,character-encoding,Python,Encoding,Character Encoding,我知道每个人都受够了编码问题,但我搞不懂这一点 我从Python中的XML文件(API)获取数据。一切正常,但当我打印包含斯堪的纳维亚字符的值时,例如Ö或Ä,它们会被弄乱: Ö -> Ã Ä -> ä XML文档以UTF-8编码 这是我的密码。很抱歉给您带来不便 # Get the data from urllib2 import urlopen ur = urlopen("http://www.leffatykki.com/xml/leffat") data = ur.read

我知道每个人都受够了编码问题,但我搞不懂这一点

我从Python中的XML文件(API)获取数据。一切正常,但当我打印包含斯堪的纳维亚字符的值时,例如
Ö
Ä
,它们会被弄乱:

Ö -> Ã
Ä -> ä
XML文档以UTF-8编码

这是我的密码。很抱歉给您带来不便

# Get the data
from urllib2 import urlopen
ur = urlopen("http://www.leffatykki.com/xml/leffat")
data = ur.read()

# Replace ampersands (triggers an error)
data = data.replace('&', '&')

# Loop XML
from lxml import etree
from cStringIO import StringIO

def fast_iter(context, func):
    for event, elem in context:
        func(elem)
        elem.clear()
        while elem.getprevious() is not None:
            del elem.getparent()[0]
    del context

def process_element(elem):
    try:
        name = elem.xpath('name/text( )')[0]
        year = elem.xpath('year/text( )')[0]
        print name
    except IndexError:
        temp = '...'

context = etree.iterparse(StringIO(data), tag='movie')
fast_iter(context, process_element)
在对“etree.iterparse”的调用中,请尝试填写编码值:

context = etree.iterparse(StringIO(data), tag='movie', encoding="utf-8")
从itree.iterparse文档中: """ |其他关键字参数: |-编码:覆盖文档编码 |-schema:要验证的XMLSchema “”“

更好的办法是——忘记这一点:

我已经下载了你的文件并到处玩了-它看起来很有效,至少在第一部电影中是这样-也许你的文件中的字符编码很糟糕?要么是塔特,要么一切都很好,而混乱只是在你打印的声明上-
尝试使用“
print name.encode(“utf-8”)
”——或者终端的正确编码,而不是让python去猜测它

哦,但是从结果来看,您只需打印出UTF-8的字节表示。“许多”有点滑稽。stdlib有一些众所周知的问题,谁知道有多少是外部软件包的问题。我已经添加了完整的代码,感谢大家的帮助。我试图下载有问题的xml以查看您在处理什么,我得到了一个损坏的gzip存档…是的,当通过浏览器访问时,它会下载一个损坏的存档。无论如何,使用上面的代码返回XML。别问我为什么。所讨论的API很年轻,不是他们最优先考虑的。实际上我在前面尝试了这两种API,但输出是相同的。找到终端的正确编码-最有可能的不是utf-8。例如,如果您使用Windows,它倾向于使用具有古老编码的传统DOS终端作为shell。对于拉丁字符集,虽然世界标准是utf-8,但所有Windows本机代码都使用“cp1252”编码,但运行Python程序的DOS终端使用“cp850”——甚至与Windows本身中使用的不兼容。现在的情况是Python找不到终端的默认编码。或者只是将输出写入文件,并在编辑器中打开它,而不是打印。