簡體   English   中英

在字符串前創建帶有“b”前綴的字節時,python 使用什么編碼?

[英]When creating bytes with “b” prefix before string, what encoding does python use?

來自 python 文檔

字節文字總是以'b'或'B'為前綴; 它們生成 bytes 類型而不是 str 類型的實例。 它們可能只包含 ASCII 字符; 數值為 128 或更大的字節必須用轉義表示。

我知道我可以創建一個帶有b前綴表達式的字節 object ,例如: b'cool' ,這會將 unicode 字符串'cool'轉換為字節。 我也知道bytes() function 可以創建 bytes 實例,但您需要指定編碼參數: bytes('cool', 'utf-8')

據我了解,如果我想將一個字符串翻譯成一個字節序列,我需要使用其中一個編碼規則。 我做了一些實驗,似乎b前綴使用 utf-8 編碼將字符串轉換為字節:

>>> a = bytes('a', 'utf-8')
>>> b'a' == a
True
>>> b = bytes('a', 'utf-16')
>>> b'a' == b
False

我的問題是當通過b前綴創建字節 object 時,python 使用什么編碼? 有沒有指定這個問題的文檔? 它是否使用 utf-8 或 ascii 作為默認值?

bytes類型可以保存任意數據。 例如,JPEG 圖像的(開頭):

>>> with open('Bilder/19/01/IMG_3388.JPG', 'rb') as f:
...     head = f.read(10)

您應該將其視為整數序列。 這也是該類型在許多方面的行為方式:

>>> list(head)
[255, 216, 255, 225, 111, 254, 69, 120, 105, 102]
>>> head[0]
255
>>> sum(head)
1712

出於方便的原因(我repr是出於歷史原因),字節的標准表示及其文字類似於字符串:

>>> head
b'\xff\xd8\xff\xe1o\xfeExif'

它在適用的情況下使用 ASCII 可打印字符,否則\xNN轉義。 如果bytes object 代表文本,這很方便:

>>> 'Zoë'.encode('utf8')
b'Zo\xc3\xab'
>>> 'Zoë'.encode('utf16')
b'\xff\xfeZ\x00o\x00\xeb\x00'
>>> 'Zoë'.encode('latin1')
b'Zo\xeb'

當您鍵入bytes文字時,Python 使用 ASCII 對它們進行解碼。 ASCII 范圍內的字符在 UTF-8 中的編碼方式相同,這就是為什么您觀察到b'a' == bytes('a', 'utf8')的等價性。 b'a' == bytes('a', 'ascii')表達式可能會少一點誤導。

暫無
暫無

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

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