0

我正在读取从另一个软件程序导入到 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?

4

1 回答 1

2

您的问题不在于您的编码和解码。您的代码正确地采用 UTF-8 字符串,并将其转换为 NFKD 规范化的 UTF-8 字符串。(如果您曾经使用 Python 3,您可能希望使用page.decode("utf-8")而不是unicode(page, "utf-8")仅仅用于面向未来的验证,并使代码更易于阅读,因为encodeanddecode更明显是并行的,但您不必这样做;这两个是等价的。)

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

有一个非常简单的方法来测试这个。让 Python 解码 UTF-8 字符串,就像它是 Windows-1252 一样,并查看生成的 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-12-17T21:11:25.473 回答