Python 将字节字符串转换为字节数组

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'。

一定有更简单的方法来做到这一点吗?

编辑:

我想将字符串转换为字节而不使用编码

tri*_*eee 5

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中它通常会选择更不可预测的东西,如以及通常更加险恶和可怕)。


Azn*_*ide 3

我找到了一个可行的解决方案

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'