簡體   English   中英

在python中,為什么調用字符串“ X”以ASCII顯示它,而調用“ print X”以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模式(如果您為ñ獲得了不同的表示形式,這是因為您的控制台使用了其他文本表示形式),所以當您按ñ時,實際上是輸入了兩個字節0xc30xb1

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.

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