[英]Why does Python 2.x throw an exception with string formatting + unicode?
[英]In python, why does calling a string, “X”, display it in ASCII, but calling “print X” display it in unicode?
我有一個字符串列表,類似於list=[a,b,c,d,e]
。
當我調用list[2]
,字符串c
顯示為ASCII; 但是,當我調用print list[2]
時,它顯示為unicode。 為什么存在這種差異?
這主要是因為Python 2中的字符串不是文本字符串,而是字節字符串 。
我想您處於REPL環境(Python控制台)中。 在控制台中評估某些內容時,將獲得其打印表示形式 ,與在表達式上調用print repr()
相同:
l = ['ñ']
l[0] # should output '\xc3\xb1'
print repr(l[0]) # should output the same
這是因為您的控制台處於UTF-8模式(如果您為ñ
獲得了不同的表示形式,這是因為您的控制台使用了其他文本表示形式),所以當您按ñ
時,實際上是輸入了兩個字節0xc3
和0xb1
。
repr()
是始終返回字符串的Python方法。 對於基本類型,此字符串是重建作為參數傳遞的值的有效來源。 在這種情況下,它將返回帶有字節序列的字符串,該字符串將重新創建另一個帶有ñ
編碼為UTF-8的字符串。 要看到這個:
repr(l[0]) # should print a string within a string: "'\\xc3\\xb1'"
因此,當您打印它時(與在控制台中進行評估相同),您將得到相同的字符串,而沒有用引號引起來,並且轉義字符被正確替換。 即:
print repr(l[0]) # should output '\xc3\xb1'
但是,當您打印該值時,即: print l[0]
,然后將這兩個字節發送到控制台。 由於控制台處於UTF-8模式,它將對序列進行解碼並將其轉換為僅一個字符: ñ
。 所以:
print l[0] # should output ñ
如果要存儲文本字符串,則必須在字符串之前使用修飾符u
。 這條路:
text = u'ñ'
現在,在評估文本時,您將看到其Unicode代碼點 :
text # should output u'\xf1'
並打印它應重新創建ñ
字形:
print text # should output `ñ`
如果要將text
轉換為字節字符串表示形式,則需要一種編碼方案(例如UTF-8):
text.encode('utf-8') == l[0] # should output True
同樣,您需要l[0]
的Unicode表示,您需要解碼這些字節:
l[0].decode('utf-8') == text # should output True
所有這些,在Python 3中請注意,默認字符串的確是Unicode字符串,您需要在文字符號前加上b
才能生成字節字符串。
這是因為這兩種顯示字符串的方法使用不同的路由來獲得最終結果。 REPL中的x
本身將調用repr(x)
並顯示它,但是print(x)
將調用str(x)
並顯示它。 允許類分別定義__repr__
和__str__
,因此它們並不總是返回相同的值。
>>> x = u"a"
>>> x
u'a'
>>> print x
a
>>> repr(x)
"u'a'"
>>> str(x)
'a'
>>>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.