[英]Python 3: How do I get a string literal representation of a byte string?
在Python 3中,如何將字節字符串插入到常規字符串中並獲得與Python 2相同的行為(即:只獲取沒有b
前綴或雙反斜杠的轉義碼)?
例如:
Python 2.7:
>>> x = u'\u041c\u0438\u0440'.encode('utf-8')
>>> str(x)
'\xd0\x9c\xd0\xb8\xd1\x80'
>>> 'x = %s' % x
'x = \xd0\x9c\xd0\xb8\xd1\x80'
Python 3.3:
>>> x = u'\u041c\u0438\u0440'.encode('utf-8')
>>> str(x)
"b'\\xd0\\x9c\\xd0\\xb8\\xd1\\x80'"
>>> 'x = %s' % x
"x = b'\\xd0\\x9c\\xd0\\xb8\\xd1\\x80'"
注意如何使用Python 3,我在輸出中得到b
前綴和雙下划線。 我想得到的結果是我在Python 2中獲得的結果。
在Python 2中,您有str
和unicode
類型。 str
表示簡單的字節字符串,而unicode
是Unicode字符串。
對於Python 3,這改變了:現在str
是Python 2中的unicode
,而byte
是Python 2中的str
。
因此,當您執行("x = %s" % '\М\и\р').encode("utf-8")
您實際上可以省略u
前綴,因為它是隱式的。 未在python中顯式轉換的所有內容都是unicode。
這將產生Python 3中的最后一行:
("x = %s" % '\u041c\u0438\u0440').encode("utf-8")
現在我如何在最終結果之后進行編碼,這是你應該經常做的事情:獲取一個傳入的對象,將其解碼為unicode(如何做到這一點),然后在進行輸出時,按照您選擇的編碼對其進行編碼。 不要嘗試處理原始字節字符串。 這只是丑陋和棄用的行為。
在Python 3示例中,您將插入到Unicode字符串中,而不是像Python 2中那樣的字節字符串。
在Python 3中, bytes
不支持插值(字符串格式化或有什么用)。
要么連接,要么全部使用Unicode,只在插值時進行編碼:
b'x = ' + x
要么
'x = {}'.format(x.decode('utf8')).encode('utf8')
要么
x = '\u041c\u0438\u0440' # the u prefix is ignored in Python 3.3
'x = {}'.format(x).encode('utf8')
在Python 2中,字節字符串和常規字符串是相同的,因此str()
不進行轉換。 在Python 3中,字符串始終是Unicode字符串,因此字節字符串的str()
進行轉換。
您可以進行自己的轉換,而不是按照自己的意願行事:
x2 = ''.join(chr(c) for c in x)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.