2010-03-10 128 views
4

我想了解python 2.5如何處理unicode字符串。儘管現在我認爲我已經很好地掌握了我應該如何在代碼中處理它們,但我並不完全理解幕後發生了什麼,特別是當您在解釋器的提示符下鍵入字符串時。Python Unicode字符串和Python交互式解釋器

因此python pre 3.0有兩種類型的字符串,即:str(字節字符串)和unicode,它們都來自basestring。字符串的默認類型是str

str對象沒有其實際編碼的概念,它們只是字節。要麼你自己編碼了一個unicode字符串,因此知道它們在哪個編碼中,或者你已經讀過一串預先編碼的字節流(不知道)。你可以猜測一個字節字符串的編碼,這個字符串的編碼方式對你來說是未知的,但是沒有一種可靠的方法來解決這個問題。您最好的選擇是儘早解碼,在代碼中隨處使用unicode,並且編碼時間較晚。

這很好。但是輸入到解釋器中的字符串確實是在你背後爲你編碼的?假如我對Python中字符串的理解是正確的,python用來做出這個決定的方法/設置是什麼?

我的困惑之源是當我在我的系統的python安裝和編輯器的嵌入式python控制檯上嘗試同樣的事情時得到的不同結果。

# Editor (Sublime Text) 
>>> s = "La caña de España" 
>>> s 
'La ca\xc3\xb1a de Espa\xc3\xb1a' 
>>> s.decode("utf-8") 
u'La ca\xf1a de Espa\xf1a' 
>>> sys.getdefaultencoding() 
'ascii' 

# Windows python interpreter 
>>> s= "La caña de España" 
>>> s 
'La ca\xa4a de Espa\xa4a' 
>>> s.decode("utf-8") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python25\lib\encodings\utf_8.py", line 16, in decode 
    return codecs.utf_8_decode(input, errors, True) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa4 in position 5: unexpected code byte 
>>> sys.getdefaultencoding() 
'ascii' 

回答

7

讓我擴大伊格納西奧的答覆:在這​​兩種情況下,有Python和你之間的一個額外層:在一個情況下,它是崇高文本和其他它的cmd.exe。您看到的行爲差異不是由於Python,而是由崇高文本(utf-8,因爲它似乎)和cmd.exe(cp437)使用的不同編碼。

所以,當你鍵入ñ崇高文本發送'\xc3\xb1'到Python,而cmd.exe發送\xa4。 [我只是在這裏找到,忽略了與這個問題無關的細節。]。

但是,Python知道這一點。從cmd.exe你可能會得到這樣的:

>>> import sys 
>>> sys.stdin.encoding 
'cp437' 

而內崇高文本你就會得到這樣

>>> import sys 
>>> sys.stdin.encoding 
'utf-8' 
+1

我得到'None'在SublimeText同時:'打印sys.stdin。編碼「,而在閒置時,我得到了運行Mac OS X的」UTF-8「 – andi 2013-12-03 14:57:30

3

解釋器使用命令提示符的本機編碼進行文本輸入。在你的情況下它是CP437:

>>> print '\xa4'.decode('cp437') 
ñ 
0

你會感到困惑,因爲編輯器和解釋器自己使用不同的編碼。 python解釋器使用您的系統默認值(在這種情況下,cp437),而您的編輯器使用utf-8

# Windows python interpreter 
>>> s = "La caña de España" 
>>> s 
'La ca\xa4a de Espa\xa4a' 
>>> s = u"La caña de España" 
>>> s 
u'La ca\xf1a de Espa\xf1a' 

這個故事的寓意是:

注意,區別,如果你指定一個unicode字符串,像這樣消失了?編碼很棘手。請確保您知道源文件的編碼格式,或者始終使用特殊字符的轉義版本進行安全播放。