【发布时间】:2014-06-29 04:22:13
【问题描述】:
我有一个字节列表(8 位字节,或者在 C/C++ 语言中它们形成 wchar_t 类型字符串),它们形成一个 UNICODE 字符串(逐字节),如何将这些值转换为 Python 字符串,尝试了很少有东西,但没有人可以将这 2 个字节连接成 1 个字符并从中构建一个完整的字符串。谢谢。
【问题讨论】:
我有一个字节列表(8 位字节,或者在 C/C++ 语言中它们形成 wchar_t 类型字符串),它们形成一个 UNICODE 字符串(逐字节),如何将这些值转换为 Python 字符串,尝试了很少有东西,但没有人可以将这 2 个字节连接成 1 个字符并从中构建一个完整的字符串。谢谢。
【问题讨论】:
通过在 str(在 Python 2.x 中)或 bytes (Python 3.x) 对象上调用 decode() 方法来将字节序列转换为 Unicode 字符串。
如果你确实有一个字节列表,那么,要获取这个对象,你可以使用''.join(bytelist) 或b''.join(bytelist)。
您需要指定用于编码原始 Unicode 字符串的编码。
但是,术语“Python 字符串”有点含糊,而且还取决于版本。 Python str 类型在 Python 2.x 中代表字节字符串,在 Python 3.x 中代表 Unicode 字符串。因此,在 Python 2 中,只需执行 ''.join(bytelist) 就会给您一个 str 对象。
Python 2 演示:
In [1]: 'тест'
Out[1]: '\xd1\x82\xd0\xb5\xd1\x81\xd1\x82'
In [2]: bytelist = ['\xd1', '\x82', '\xd0', '\xb5', '\xd1', '\x81', '\xd1', '\x82']
In [3]: ''.join(bytelist).decode('utf-8')
Out[3]: u'\u0442\u0435\u0441\u0442'
In [4]: print ''.join(bytelist).decode('utf-8') # encodes to the terminal encoding
тест
In [5]: ''.join(bytelist) == 'тест'
Out[5]: True
【讨论】:
Out[3] 将显示一个常规(Unicode)字符串。输出 4 将打印字符串(几乎相同)。
您还可以使用decode() 将字节列表转换为字符串列表
stringlist=[x.decode('utf-8') for x in bytelist]
【讨论】:
b'\x7f' 上的任何值解码为 UTF-8,这就是此答案中的代码将执行的操作。鉴于 OP 已声明它们具有来自 C++ wchar_t 数据类型的 8 位字节,因此几乎 保证 不是 ASCII 或 UTF-8。跨度>
以下是最适合我的方法:
import codecs
print(type(data)) # <class 'bytes'>
data: str = codecs.decode(data, 'UTF-8')
【讨论】: