2009-07-12 72 views
19

在Python中進行編碼時,是否認爲通過常規字符串選擇Unicode字符串是一種很好的做法?我主要工作在Windows平臺上,大多數字符串類型現在都是Unicode(即.NET字符串,'_UNICODE'在默認情況下在新的C++項目中打開等)。因此,我傾向於認爲使用非Unicode字符串對象的情況是一種罕見的情況。無論如何,我很好奇Python實踐者在真實世界的項目中做了些什麼。默認情況下,我應該使用Unicode字符串嗎?

回答

17

從我的做法 - 使用unicode。

在一個項目開始時,我們使用了字符串,但是我們的項目不斷增加,我們正在實施新功能並使用新的第三方庫。在與非Unicode/unicode字符串混亂一些功能開始失敗。我們開始花時間對這些問題進行本地化並修復它們。但是,一些第三方模塊不支持unicode,並且在切換到第三方模塊後開始失敗(但這不是排除規則)。

另外我有一些經驗,當我們需要重寫某些第三方模塊(例如SendKeys),因爲他們不支持unicode。如果它從頭開始它會更好:)

所以我認爲今天我們應該使用unicode。

P.S.所有那些亂七八糟的東西只是我的討厭看法:)

+2

+1:處理文本時總是使用unicode。每當需要將文本數據視爲字節時(例如在網絡上移動或寫入磁盤時) - 將unicode轉換爲一系列字節(在Python中表示爲一個字符串)。通過調用編碼或unicode進行轉換。 – codeape 2009-07-22 13:31:38

2

如果您處理嚴重受限的內存或磁盤空間,請使用ASCII字符串。在這種情況下,你應該另外編寫你的軟件在C或更緊湊的東西:)

13

當你問這個問題,我想你使用的是Python 2.x.

Python 3.0在字符串表示中發生了很大變化,現在所有文本都是unicode。
我會在任何新項目中使用unicode - 以與切換到Python 3.0的兼容方式(請參閱details)。

+0

是的,未來兼容性非常重要! – 2009-07-12 18:17:38

4

Mihails的附加評論我會說:使用Unicode,因爲它是未來。在Python 3.0中,非Unicode將消失,並且我知道,所有的「U」-Prefixes都會遇到麻煩,因爲它們也消失了。

5

它可能會非常棘手一直使用Unicode字符串在Python 2.x的 - 無論是因爲有人無意中使用了更自然str(blah),他們的意思unicode(blah),忘記在字符串文字,第三方模塊不兼容的u前綴 - 不管。所以在Python 2.x中,只有必須使用unicode,並準備提供良好的單元測試覆蓋率。

但是,如果您可以選擇使用Python 3.x,則無需關心 - 字符串將是unicode,無需額外的工作。

13

是的,使用unicode。

一些提示:

  1. 在做任何類型的二進制格式的輸入輸出,看完之後直接解碼並直接寫入之前編碼,讓你永遠需要混合字符串和unicode。因爲混音往往會導致UnicodeEncodeDecodeErrors遲早。

  2. [忘了這個,我的解釋讓它更加混亂。移植到Python 3只是一個問題,那麼你可以關心它。]

  3. Unicode的常見Python新手錯誤(不是說你是新手,但這可能會被新手讀取):不要混淆編碼和解碼。請記住,UTF-8是一種編碼,因此您將Unicode編碼爲UTF-8和DEcode。

  4. 不要陷入在Python中設置默認編碼的誘惑(通過sitecustomize.py中的setdefaultencoding或類似的方法)到最常用的任何東西。如果您重新安裝或移動到另一臺計算機或突然需要使用其他編碼,這隻會給您帶來問題。明確。請記住,並不是所有的Python 2s標準庫都接受unicode。如果你喂一個unicode方法,它不起作用,但它應該嘗試將它餵給ascii並看看。示例:urllib.urlopen(),如果您爲其提供unicode對象而不是字符串,則會失敗並顯示無用的錯誤。

嗯。這就是我現在能想到的!

+0

第3點是如此真實 - 我認識的每個人(包括我)都犯了這個錯誤,而不僅僅是一次! – 2009-07-12 19:05:52

相關問題