HOWTO · Python
在 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)