2011-05-30 124 views
3

我有一個從網站獲取多語言信息的Python應用程序,它將它們呈現在一個小的GUI窗口(基於wxpython)中。
我(當前)不在我的源文件中使用任何特定的unicode語句。Python,unicode支持的最佳途徑?

現在,當我在Eclipse中運行我的python應用程序時,法語字符(如ë)很好地顯示出來,當我從py2exe打包版本運行它時,字符變得非常奇怪。 我真的不明白爲什麼與py2exe建設不會產生unicode或編碼相關的錯誤。

但是,要解決這個問題,並按照this文章中,我包裹着我的unicode(my_string, "utf-8")通話字符串只是將其輸出到屏幕之前。這解決了它。

問題:

unicode()通話
  • 披着字符串之前顯示好辦法做到這一點?
  • 爲什麼它在沒有從Eclipse內部進行unicode轉換的情況下工作,而不是從Windows打包的.exe版本轉換而來?

我試過在unicode中繞過我的頭多次,但看起來我不是unicode兼容的: - |

回答

6

最好的辦法是儘快確保字符串是unicode 。如果你在網站上搜索的圖書館沒有用unicode證明你,那麼他們沒有做他們應該做的(imho)。然後,你必須使用與你正在使用的網頁相同的編碼將它們解碼爲unicode。

你的方法基本上是相反的,儘可能晚的解碼。迄今爲止它的工作基本上只是純粹的運氣,因爲你還沒有遇到任何非utf8字符串。任何iso-8859-1字符串都會破壞你的應用程序。

+0

那麼,我使用'urllib2.urlopen()',我使用美麗的湯解析。根據[BeautifulSoup的文檔](http://www.crummy.com/software/BeautifulSoup/documentation.html#Beautiful%20Soup%20Gives%20You%20Unicode,%20Dammit),它應該總是返回unicode。但是如果我在我的任何一個Beuatiful Soup上輸入(值)'返回最終值,我會得到''而不是預期的'(當我做'打印值'時,它不會預先字符串前面的「u」)。所以我不相信我真的從那裏使用unicode。 – Rabarberski 2011-05-30 11:38:33

+1

儘管文檔中提到(http://www.crummy.com/software/BeautifulSoup/documentation.html#Beautiful湯給你Unicode,Dammit),有很多情況下BeautifulSoup不返回unicode,請參閱http:///stackoverflow.com/questions/3192645/beautifulsoup-doesnt-give-me-unicode。恕我直言lxml更好地工作,並更一致的刮。 – 2011-05-30 12:08:38

+0

是的,我剛剛發現了一個相關的SO帖子:http://stackoverflow.com/questions/843227/how-to-render-contents-of-a-tag-in-unicode-in-beautifulsoup確實描述了同樣的問題:'renderContents()'(我正在使用)返回一個字符串,而不是unicode。 – Rabarberski 2011-05-30 12:16:09

0

我可能是錯的,但我認爲它在Eclipse中工作,因爲UTF-8默認工作,py2exe產生Windows可執行文件是Latin-1。

通過使用unicode(a_string, "UTF-8"),您可以顯式使用UTF-8編碼創建Python unicode對象。所以,解釋器在使用該對象時採用這種編碼。

一個unicode對象可以在許多方法/函數/類中透明地用作字符串,包括print。無論如何,有人警告說,有時候,您必須使用string作爲函數參數。

你把你的文件的@top,# -*- coding: utf-8 -*-這個東西寫給解釋器「這個文件中的任何字符串是UTF-8」嗎?

它可以讓你避免你的字符串顯式轉換爲unicode對象。

+0

正如我理解'# - * - coding:utf-8 - * - '行,這僅用於支持您/ code /要用unicode編寫,而不是使用PyDev處理的數據是 – Rabarberski 2011-05-30 11:43:14

1

爲什麼它沒有在Eclipse內進行unicode轉換,而是從Windows打包的.exe版本轉換而來?

我假設你在Eclipse中使用PyDev?

最近它發生在我身上,PyDev將sys.getDefaultEncoding()更改爲「utf-8」。這意味着從文件(或其他)讀取和寫入將默認爲UTF-8。但是,一旦我從控制檯啓動它,它是回OS默認值(如ascii適用於Windows)

申報串好的做法,是在前面加上一個u

u"the string" 

使該字符串是UTF-8。它成爲默認的Python 3 +

+0

。感謝您的解釋 – Rabarberski 2011-05-30 12:48:56