5

我剛剛遇到一個unicode錯誤與我運行的應用程序,每時每刻都必須處理真正奇怪的字符串,最近,Python Unicode錯誤,同步開發環境和生產

Pınar Karsıyaka 
在我的開發環境(集錦W的PyDev的上小牛的Mac與最新的自制蟒蛇安裝),處理這個字符串不產生錯誤,

,並打印到控制檯

P\u0131nar Kars\u0131yaka v Torku Selcuk 

但在生產環境中,標準的Ubuntu和Python安裝在Amazo ñEC2小盒子,這是印像

P\xc4\xb1nar Kars\xc4\xb1yaka v Torku Selcuk 

,並給出了可怕的Python的錯誤之一,

UnicodeEncodeError: 'ascii' codec can't encode character u'\u0131' in position 50: ordinal not in range(128) 

我想知道如何(如果可能的話),以使督促環境能夠來處理這些字符,就像我的開發環境一樣,但也希望能夠改變我的開發環境,像prod之類的破解,這樣我就可以處理髮生在代碼中的事件。

感謝您對此的任何幫助。

的Mac的Python - 的Python 2.7.5(默認情況下,2013年11月1日,18點38分34秒) [4.2.1 GCC兼容蘋果LLVM 5.0(鐺-500.2.79)]對達爾文

Ubuntu的Python - Python 2.7.3(默認,2013年4月10日,06:20:15) [GCC 4.6.3]在linux2上

+0

Python 2或Python 3? – metatoaster

+0

可能在服務器上的shell編碼不是UTF-8,但你的是在家。比較每個例如'echo $ LC_ALL'的值。 –

+0

每個Python 2.7,增加了問題的全部細節。 @ Two-BitAlchemist,在我的兩臺機器上顯示爲空白/空白。 – seaders

回答

3

如果你在2.7分支的python源代碼中稍微探索一下,你會發現那麼default encoding of unicode strings首先是set to some forced value(現在,它是「ascii」,儘管它在那之前是「utf-8」),但在解釋器的每個實例化過程中它是overridden by the site module

要檢查每個平臺上的行爲,運行:

$ python -c 'import sys; print(sys.getdefaultencoding())' 

現在,如果你想他們甚至,它是不是真的簡單,因爲功能 「setdefaultencoding」是deleted in the site module,讓你有 重新加載sys模塊來獲得它:

$ python -c 'import sys; reload(sys); sys.setdefaultencoding("utf-8"); print(sys.getdefaultencoding())' 

這樣的話,你可以有相同的編碼,在你的解釋,在每個平臺REGA無編程語言和 編碼定義在從os到python構建的多個級別。

1

庫版本

請驗證所有庫的版本是一樣的,我懷疑是有一個API的變化,從一些外部數據源返回unicode VS str。在升級SQLObjectCherrypy之前,我看到過這些問題。另外數據源設置很重要,例如,如果您使用mysql服務器,則需要注意default_encoding

您的問題未指定數據源,很難猜測。

至少在兩個enrivonments中做pip freeze並比較版本號。

默認編碼

檢查是否存在的環境之一sitecustomize.py - 這是設立任何靠不住的東西正式的方式(你不應該這樣,但是,那是另一回事)。

它可能正是@ chocko01建議的 - 設置deafault編碼。通過在兩種環境中記錄sys.getdefaultencoding()來檢查它。

在Python中設置默認編碼使得轉換unicode<->str(Python2)和str<->bytes(Python3)是透明的,但從長遠來看,這是一個壞主意。請記住,explicit is better than implicit

跟蹤你的數據

這是一個艱難CCC破解,但除非你能在一個可重複的測試捕獲這個特殊的問題,第二個最好的是轉儲噸原木,然後你的工作方式向後看看你的時髦輸入來自哪裏。

然後向下追蹤以確定您的本地環境與生產環境之間的區別。

在發生錯誤時,您的本地環境中爲unicode,編碼爲UTF-8,生產環境中爲str。事實上,你有兩個環境的樣本表明你能夠重現這個問題。也許你應該寫一個自動化測試。

+0

這不是一個答案,而應該是對https://stackoverflow.com/a/23319208/247648 – Giel

+0

擴展的評論;順便說一句@Giel,如果我們要迂腐,你的鏈接指向我的答案,而不是問題。 –

+1

不,它指向choko01的答案,我看到你已經完全重寫了你的答案,所以我將不會down-down這個 – Giel