【问题标题】:How to encoding a string into a bytearray using utf-8?如何使用 utf-8 将字符串编码为字节数组?
【发布时间】:2020-03-09 20:02:18
【问题描述】:

我想使用 utf-8 对字节数组中的字符串进行编码。例如,对于字符串"CD",我想获取b"\x43\x44"。我已经尝试过了,但它不起作用:

def toTab(strMessage):
    return strMessage.encode('utf-8')

我得到b'CD',这不是我想要的结果。

【问题讨论】:

  • b'\x43\x44'b'CD' 是同一个字节串,只是写法不同而已。检查这个表达式:b'\x43\x44' == b'CD'。这就像为所有相同的数字写 3.03.000003e0

标签: python arrays string utf-8 encode


【解决方案1】:

从 Python 2 到 3 的主要变化之一是 str 数据类型。更多关于 here 的信息。基本上,它们总是尽最大努力使人类可读,当试图将十六进制值保留在字符串中时,这可能会导致一些有趣和令人沮丧的事情。字符串前面的 b 告诉 python 它已编码,因此您的函数实际上正在工作,但它显示为人类可读。要显示这一点,只需尝试:

b'CD'.hex()

或者,更具体地说:

'CD'.encode().hex()

给出:

'4344'

编辑:澄清一下,python str 将始终将 ASCII 表示为 ASCII。这可以通过在控制台中输入以下内容来显示:

"résumé".encode("utf-8")

这将产生:

b'r\xc3\xa9sum\xc3\xa9'

请注意,所有 ASCII 都是这样呈现的,而非 ASCI 由字节表示。还要注意一些关键,UTF-8 字符可以用 1 到 4 个字节(其中一个字节是 8 位)的任何形式表示。另一方面,整个 ASCII 集只能用 7 位表示,所有 ASCII 字节都用零填充。

同样,您的输出是b'\x43\x44',它只是在视觉上表示为b'CD'。如果您将其传递给 c 程序以利用缓冲区溢出,它会根据您的需要将字符串识别为 b'\x43\x44'

要显示这一点,请尝试:

if b'\x43\x44' == b'CD':
    print(True, b'\x43\x44')
else:
    print(False)

将打印:True b'CD'

【讨论】:

  • 非常感谢!我明白你说的。其实我想得到b“\x43\x44”,但没关系。最重要的是我了解 Python 在做什么。
【解决方案2】:

您可以通过手动组合和格式化 bytearray 的每个字节来获得所需的内容。

def toTab(strMessage):
    return 'b"{}"'.format(''.join(r'\x{:0x}'.format(b) for b in strMessage))

msg = b"\x43\x44"
print(toTab(msg))  # -> b"\x43\x44"

【讨论】:

  • 但这并不能满足 OP 的要求,因为您正在放入一个字节数组。如果你已经有了字节数组,为什么不直接使用它,而不是放入一个函数来得到同样的东西呢?
  • @jacob:也许我误解了 OP 所说的“我想获得b"\x43\x44"”的意思——我认为它的字面意思是一个包含这些字符的字符串。
猜你喜欢
  • 2013-05-11
  • 1970-01-01
  • 2018-05-13
  • 2016-12-08
  • 2011-08-09
  • 2011-08-16
  • 2020-07-17
  • 1970-01-01
  • 2014-01-18
相关资源
最近更新 更多