簡體   English   中英

Python 3:如何獲得字節字符串的字符串文字表示?

[英]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中,您有strunicode類型。 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.

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