2012-12-17 78 views
0

我正在讀取從另一個軟件程序導入到excel xml文件中的字符串列表。我不確定excel文件的編碼是什麼,但我非常肯定它不是windows-1252,因爲當我嘗試使用該編碼時,我發現很多錯誤。字符編碼,XML,Excel,python

現在引起我麻煩的具體詞是:「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?

回答

2

你的問題不是你的編碼和解碼。你的代碼正確地使用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對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 
+0

非常感謝 爲了這。 –