HOWTO · Python

在 Python 中將字串轉換為二進位制

本文示範如何將字串表示為 Unicode 碼位的二進位值,或指定文字編碼後各位元組的二進位值。

本頁內容

請依照用途選擇表示方式:ord() 會取得每個字元的 Unicode 碼位;先對字串進行編碼,則會得到所選文字編碼中的位元組。對某些文字而言,這兩種方式產生的序列並不相同。若要取得不含前綴的二進位數字,請使用 format(value, "b");若需要 0b 前綴,則可使用 bin(value)。

使用 ord() 和 format() 將每個字元的 Unicode 碼位轉為二進位

使用 ord() 取得字元的 Unicode 碼位,再用 format() 搭配 b 格式規格,將該整數表示為二進位。這種表示方式呈現的是碼位,並不會將字串編碼成 UTF-8 位元組。二進位數字不會補齊至固定寬度。

以下可執行範例會格式化字串 Python 中每個字元的碼位,並以空格連接各個值:

text = "Python"
binary_code_points = " ".join(format(ord(character), "b") for character in text)
print(binary_code_points)

使用 bytearray() 和 format() 將編碼後的字串位元組轉為二進位

若要表示編碼後的位元組,請先選擇一種編碼,並將其傳給 bytearray()。內建的 bytearray() 型別可逐一取得產生的位元組值;format(value, "08b") 則會將每個位元組顯示為八位二進位數字。UTF-8 對許多字元會使用多個位元組,因此產生的值可能比來源字串中的字元數更多。

以下範例會將 café 編碼為 UTF-8,並格式化每個位元組:

text = "café"
encoded_bytes = bytearray(text, "utf-8")
binary_bytes = " ".join(format(value, "08b") for value in encoded_bytes)
print(binary_bytes)

使用 map() 和 bin() 產生帶有前綴的位元組值

map() 會對可疊代物件中的每個項目套用轉換;它本身不會編碼字串。此處先由 bytearray() 將文字編碼為 UTF-8,再由 map(bin, ...) 轉換產生的每個位元組值。與 format(value, "b") 不同,bin() 會包含 0b 前綴。如果輸出格式只需要二進位數字,可使用 format() 移除該前綴。

text = "Python"
binary_bytes = " ".join(map(bin, bytearray(text, "utf-8")))
print(binary_bytes)

只有 ASCII 文字才使用 ASCII 編碼

ASCII 是字元集有限的一種編碼。它適用於 Python 這類文字,但無法編碼 é 等字元;對這類文字呼叫 .encode("ascii") 會引發 UnicodeEncodeError。若需要一般 Unicode 文字的位元組表示,可使用 UTF-8。Python 不會自動將字串轉成 UTF-8 位元組,請明確指定所需的編碼。

對於只含 ASCII 字元的文字,使用明確指定的 ASCII 編碼,也能套用相同的位元組格式化方式:

text = "Python"
encoded_bytes = text.encode("ascii")
binary_bytes = " ".join(format(value, "08b") for value in encoded_bytes)
print(binary_bytes)