2016-07-08 30 views
0

我知道在Python 2 unicode錯誤是一團糟,但我不明白的是爲什麼str.format將它們引入到其他工作情況。我是有一些Unicode字符的麻煩,並測試出IDLE了我:爲什麼使用str.format創建unicode錯誤?

>>> s = u'\xef' 
>>> print s 
ï 
>>> print "%s" % s 
ï 
>>> print '' + s 
ï 
>>> print '{}'.format(s) 

Traceback (most recent call last): 
    File "<pyshell#2>", line 1, in <module> 
    print '{}'.format(s) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xef' in position 0: ordinal not in range(128) 

似乎str.format就是這是一個問題的唯一例子。我猜測,不知何故該函數正在做一個壞的假設,只是通過ascii適當的字符串,但我想知道我怎麼能處理這最好的結果是不穩定的。

這似乎只發生在unicode字符串時,無論是使用實際字符還是代碼。這兩種選擇視爲純字符串,做工精細:

>>> s = 'ï' 
>>> print '{}'.format(s) 
ï 
>>> s = '\xef' 
>>> print '{}'.format(s) 
ï 
>>> s = u'ï' 
>>> print '{}'.format(s) 

Traceback (most recent call last): 
    File "<pyshell#6>", line 1, in <module> 
    print '{}'.format(s) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xef' in position 0: ordinal not in range(128) 
+0

這不是一個「壞的假設」 - 這是歷史。如果您在引入良好的Unicode支持之前使用字符串類型和方法,那麼您將得到錯誤的Unicode編碼支持。如果您想要很好的Unicode支持,請使用Python 3,或者非常小心地始終在Python 2中使用unicode類型。 –

回答

2

請記住,當你說

print '{}'.format(s) 

你嘗試用一個Unicode字符串格式化字符串是字節(python2 STR型)。 這個:

print u'{}'.format(s) 

工作正常。

相關問題