2011-07-18 15 views
1
mystr = 'aaaa' 
myvar = u'My string %s' % str(mystr) 

這可能是未來的問題嗎?我搞砸了一些在Python中使用電子郵件模塊的內部代碼,並發現了一些類似的代碼。 mystr將始終只有ascii字符,因爲它來自具有預定義ascii唯一字符的列表。在python 2.X中混合unicode和str ...問題?

我沒有寫代碼,並有str(mystr)mystr不會改變這個問題的問題。

做的第一個片段,我將有一個安全的unicode對象,或者說我必須做

mystr = u'aaaa' 
myvar = u'My string %s' % mystr 

mystr = 'aaaa' 
myvar = u'My string %s' % unicode(mystr) 

? (我知道這不是正確的做法,我知道我應該處理異常,我只是在第一個片段返回一個有效的unicode對象時才問這裏,或者如果Python搞砸了它的內部或某些東西)

+0

2 upvotes? 2 downvotes將是合適的 –

+0

@Blackmoon:我在問題中增加了更多信息。 'mystr'將始終只有ascii字符。 –

+0

你預見什麼問題? –

回答

4

嘗試在字符串中放置實際的Unicode符號(如元音變音或西裏爾字母)並觀察地獄破壞。 :)

s = 'свят' # world 
v = u'здравей %s' % s # hello %s 

Traceback (most recent call last): 
File "<input>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 0: ordinal not in range(128) 

的問題是,你很可能會代碼的申請,並於一光澤明亮一天,一些俄羅斯和德國會寫她的名字,並會突然得到一個Internal Server Error對具有她的名字了非ASCII符號。


我知道......我想諮詢一下我的示例中的情況下,只有在

使用ASCII沒有,就不會有問題。恕我直言,這是Python的錯誤,因爲這是bug,等待咬人。這應該是一個致命的錯誤,但是由於歷史原因,我想,事實並非如此。

+0

我知道......我在詢問我的例子中的情況,僅在'mystr'中使用ascii。 –

+1

只使用ASCII是一個愚蠢的假設。總會有數據不是ascii,你的應用程序會打嗝,你會回到SO並開始哭泣。 –

+0

只有ASCII碼的數據不是編寫錯誤代碼的藉口。 –

0

只要常規的8位字符串只包含ASCII字符,就沒問題。如果您真的只需要ASCII,可以完成此操作以節省處理時間和/或內存空間。

它可能是未來的問題嗎?是的,如果你正在輸入一個非ASCII字符集並將其保存在一個字符串中。一致性通常也是一個好主意 - 如果您需要廣泛使用Unicode,請不要將字符串用作任何地方的文本存儲,除非有其他好的理由。