【问题标题】:Convert bytearray containing unicode data to str将包含 unicode 数据的字节数组转换为字符串
【发布时间】:2020-06-20 15:38:21
【问题描述】:

我需要将包含未编码原始 unicode 数据的字节数组转换为 unicode 字符串,例如unicode \u2167 代表罗马数字 8:

print(u'\u2167')
Ⅷ

将此信息存储在字节数组中,我需要找到一种方法将其转换回 unicode。从例如解码'utf8' 显然不起作用:

b = bytearray([0x21,0x67])
print(b.decode('utf8'))
!g

有什么想法吗?

编辑

@Luke 的评论让我走上了正轨。显然,原始数据(不是我在这里展示的简化数据)被编码为 UTF-16le。数据是从 wxpython TextDataObject 获得的。 wxpython 内部通常使用 unicode。这就是让我认为我正在处理 unicode 数据的原因。

【问题讨论】:

  • 我认为我们没有足够的信息来帮助您。您只给出了数据的两个字节:是否所有字符都使用两个字节对表示?如果您编写 print(b.decode("utf-16be")),您的单字符示例可以正确解码,但只有在整个数据中使用 UTF-16BE 时,它才会更普遍。

标签: python python-3.x unicode encoding


【解决方案1】:

...一个字节数组,其中包含未编码的原始 unicode 数据

如果它在字节数组中,则根据定义对其进行编码。 Python bytesbytearray 类型可以包含编码的 Unicode 数据。 str 类型包含 Unicode 代码点。您将.decode 一个字节字符串转换为 Unicode 字符串,并将.encode 一个 Unicode 字符串转换为字节字符串。您的示例使用的编码是 UTF-16BE:

>>> b = bytearray([0x21,0x67])
>>> b.decode('utf-16be')
'Ⅷ'

【讨论】:

  • 我同意根据定义对字节数组的内容进行编码。但是将纯 unicode 数据存储在字节数组中并非不可能。 \u2167 与其 utf-16be 编码的字节数组之间没有数字差异这一事实让我走错了方向。
  • @ChristianK 这是一种编码 :) Unicode 代码点只是数字。编码定义了如何将这些数字存储为字节。代码点的范围从 0-1113111 不完全适合两个字节。 UTF-16BE 定义了如何存储整个范围。
【解决方案2】:

print(b.decode('utf8')) 行不正确,正确用法是:

print(b.decode("utf-8"))

【讨论】:

  • 其实都可以,而且'UTF8'和'UTF-8'也可以。
  • 我提到它是因为文档只显示utf-8
  • The documentationutf8 列为utf-8 的别名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 2015-03-29
  • 1970-01-01
相关资源
最近更新 更多