Azn*_*ide 5 python character-encoding
例如给定任意字符串。可能是chars或只是随机的bytes:
string = '\xf0\x9f\xa4\xb1'
Run Code Online (Sandbox Code Playgroud)
我想输出:
b'\xf0\x9f\xa4\xb1'
Run Code Online (Sandbox Code Playgroud)
这看起来很简单,但我无法在任何地方找到答案。当然,只需键入b后面的字符串即可。但我想在运行时执行此操作,或者从包含字节字符串的变量执行此操作。
如果给定的string是AAAA或一些已知的,characters我可以简单地执行string.encode('utf-8'),但我期望字节串只是随机的。对'\xf0\x9f\xa4\xb1'(随机字节)执行此操作会产生意外结果b'\xc3\xb0\xc2\x9f\xc2\xa4\xc2\xb1'。
一定有更简单的方法来做到这一点吗?
编辑:
我想将字符串转换为字节而不使用编码
Latin-1 字符编码简单地将 0x00-0xff 范围内的每个代码点编码为具有相同值的字节(与 Python 支持的所有其他编码不同)。
byteobj = '\xf0\x9f\xa4\xb1'.encode('latin-1')
Run Code Online (Sandbox Code Playgroud)
您说您不想使用编码,但避免使用编码的替代方案似乎要差得多。
UTF-8 编码是不合适的,因为正如您已经发现的,0x7f 以上的代码点映射到多个字节(最多四个字节)的序列,其中没有一个恰好是作为字节值的输入代码点。
省略参数.encode()(如现在已删除的答案)迫使Python猜测编码,这会产生系统相关的行为(可能在除Windows之外的大多数系统上选择UTF-8,在Windows中它通常会选择更不可预测的东西,如以及通常更加险恶和可怕)。
我找到了一个可行的解决方案
import struct
def convert_string_to_bytes(string):
bytes = b''
for i in string:
bytes += struct.pack("B", ord(i))
return bytes
Run Code Online (Sandbox Code Playgroud)
string = '\xf0\x9f\xa4\xb1'
print (convert_string_to_bytes(string)))
输出:
b'\xf0\x9f\xa4\xb1'