簡體   English   中英

Python Unicode字符串和Python交互式解釋器

[英]Python Unicode strings and the Python interactive interpreter

我試圖理解python 2.5如何處理unicode字符串。 雖然到現在為止我認為我已經很好地掌握了我應該如何在代碼中處理它們,但我並不完全理解幕后發生的事情,特別是當你在解釋器的提示符下輸入字符串時。

所以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'

讓我展開Ignacio的回復:在這兩種情況下,Python和你之間都有一個額外的層:在一種情況下它是Sublime Text而在另一種情況下它是cmd.exe 您看到的行為差異不是由於Python,而是由Sublime Text (utf-8,看起來像)和cmd.exe (cp437)使用的不同編碼。

因此,當您鍵入ñSublime Text會將'\\xc3\\xb1'發送到Python,而cmd.exe發送\\xa4 [我只是在這里,省略與問題無關的細節。]。

不過,Python知道這一點。 cmd.exe你可能會得到類似的東西:

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

而在Sublime Text中,你會得到類似的東西

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

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

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

您會感到困惑,因為編輯器和解釋器本身使用不同的編碼。 python解釋器使用您的系統默認值(在本例中為cp437 ),而編輯器使用utf-8

注意,如果指定unicode字符串,差異就會消失,如下所示:

# 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'

這個故事的主旨? 編碼很棘手。 確保您知道源文件的編碼,或者通過始終使用特殊字符的轉義版本來保證安全。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM