【问题标题】:Character Encoding, XML, Excel, python字符编码、XML、Excel、python
【发布时间】:2012-12-17 19:48:16
【问题描述】:

我正在读取从另一个软件程序导入到 excel xml 文件中的字符串列表。我不确定 excel 文件的编码是什么,但我很确定它不是 windows-1252,因为当我尝试使用该编码时,我会遇到很多错误。

现在给我带来麻烦的具体词是:“Zmysłowska, Magdalena”(注意“l”不是标准的“l”,而是一个斜线)。

我已经尝试了一些东西,在这里我会提到其中的三个:

(1)

page = unicode(page, "utf-8")
page = unicodedata.normalize("NFKD", page)
page = page.encode("utf-8", "ignore")

Output: Zmys\xc5\x82owska, Magdalena
Output after print statement: Zmysłowska, Magdalena

(2)

page = unicode(page, "utf-8")
page = unicodedata.normalize("NFKD", page)

Output: Zmys\u0142owska, Magdalena
Output after print statment: Zmysłowska, Magdalena

Note: this is great, but I need to encode it back to utf-8 before putting the string into my     db.  When I do that, by running page.encode("utf-8", "ignore"), I end up with Zmysłowska, Magdalena again.

(3) 什么都不做(不规范化、不解码、不编码)。看起来字符串进来时已经是utf-8了。但是,当我什么都不做时,字符串再次以以下输出结束:

Output: Zmys\xc5\x82owska, Magdalena
Output after print statement: Zmysłowska, Magdalena

我有没有办法将此字符串转换为 utf-8?

【问题讨论】:

    标签: python excel encoding utf-8


    【解决方案1】:

    您的问题不在于您的编码和解码。您的代码正确地采用 UTF-8 字符串,并将其转换为 NFKD 规范化的 UTF-8 字符串。 (您可能想使用 page.decode("utf-8") 而不是 unicode(page, "utf-8") 只是为了在您使用 Python 3 的情况下进行未来验证,并使代码更易于阅读,因为 encodedecode 更明显并行,但您不必这样做;两者是等价的。)

    您的实际问题是您将 UTF-8 字符串打印到某些不是 UTF-8 的上下文中。您很可能正在打印到cmd 窗口,该窗口默认为 Windows-1252。因此,cmd 尝试将 UTF-8 字符解释为 Windows-1252,并得到垃圾。

    有一个非常简单的方法来测试它。让 Python 像 Windows-1252 一样解码 UTF-8 字符串,并查看生成的 Unicode 字符串是否与所看到的一样。

    >>> print page.decode('windows-1252')
    Zmysłowska, Magdalena
    
    >>> print repr(page.decode('windows-1252'))
    u'Zmys\xc5\u201aowska, Magdalena'
    

    有两种解决方法:

    1. 打印 Unicode 字符串,让 Python 处理。
    2. 打印转换为适当编码的字符串。

    对于选项 1:

    print page.decode("utf-8") # of unicode(page, "utf-8")
    

    对于选项 2,它将是以下之一:

    print page.decode("utf-8").encode("windows-1252")
    print page.decode("utf-8").encode(sys.getdefaultencoding())
    

    当然,如果你保留中间的 Unicode 字符串,你就不需要所有那些decode 调用:

    upage = page.decode("utf-8")
    upage = unicodedata.normalize("NFKD", upage)
    page = upage.encode("utf-8", "ignore")
    
    print upage
    

    【讨论】:

    • 非常感谢。
    猜你喜欢
    • 2012-02-23
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    相关资源
    最近更新 更多