【发布时间】:2016-12-08 05:14:57
【问题描述】:
我有一个表示 utf-8 编码字符串的字节数组。我想将这些字节解码回 Pyton2 中的字符串。我的整个程序都依赖 Python2,所以我无法切换到 Python3。
array = [67, 97, 102, **-61, -87**, 32, 70, 108, 111, 114, 97]
-> 咖啡馆é 植物区系
由于我想要的字符串中的每个字符不一定由数组中的 1 个字节表示,因此我不能使用如下解决方案:
"".join(map(chr, array))
我试图创建一个函数来遍历数组,当它遇到一个不在 0-127 (ASCII) 范围内的数字时,创建一个新的 16 位整数,将当前位向左移动 8 位,然后使用按位或添加以下字节。最后它会使用 unichr() 对其进行解码。
result = []
for i in range(len(byte_array)):
x = byte_array[i]
if x < 0:
b16 = x & 0xFFFF # 16 bit
b16 = b16 << 8
b16 = b16 | byte_array[i+1]
result.append(unichr(m16))
else:
result.append(chr(x))
return "".join(result)
然而,这并不成功。
下面的文章很好地解释了这个问题,并且包含了一个 nodeJS 解决方案:
http://ixti.net/development/node.js/2011/10/26/get-utf-8-string-from-array-of-bytes-in-node-js.html
【问题讨论】:
-
UTF-8 解码不是这样工作的。
-
你不能用
00“填充”0-128范围内的每个数字吗? -
正如您在我的回答中看到的那样,您与 map 和 chr 版本的加入几乎可以工作 - 但对于负数的问题。我的回答基本相同,使用更易读的生成器表达式,并处理负数。
标签: python arrays python-2.7 utf-8