如何在 Python2 中将 utf-8 字节数组解码为字符串?

Tim*_*tri 5 python arrays utf-8 python-2.7

我有一个表示 utf-8 编码字符串的字节数组。我想将这些字节解码回 Pyton2 中的字符串。我的整个程序依赖Python2,所以我无法切换到Python3。

\n\n
array = [67, 97, 102, **-61, -87**, 32, 70, 108, 111, 114, 97] \n
Run Code Online (Sandbox Code Playgroud)\n\n

-> 咖啡馆\xc3\xa9弗洛拉

\n\n

由于我想要的字符串中的每个字符不一定由数组中的 1 个字节表示,因此我不能使用如下解决方案:

\n\n
"".join(map(chr, array))\n
Run Code Online (Sandbox Code Playgroud)\n\n

我尝试创建一个函数来逐步遍历数组,每当遇到不在 0-127 (ASCII) 范围内的数字时,创建一个新的 16 位 int,将当前位向左移动 8 以上,然后添加使用按位或运算来计算后面的字节。最后它会使用 unichr() 对其进行解码。

\n\n
result = []\n\n\nfor i in range(len(byte_array)):\n    x = byte_array[i]\n    if x < 0:\n        b16 = x & 0xFFFF # 16 bit\n        b16 = b16 << 8\n        b16 = b16 | byte_array[i+1]\n        result.append(unichr(m16))\n    else:\n        result.append(chr(x))\n\nreturn "".join(result)\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而,这并没有成功。

\n\n

下面的文章很好地解释了这个问题,并包含了一个nodeJS解决方案:

\n\n

http://ixti.net/development/node.js/2011/10/26/get-utf-8-string-from-array-of-bytes-in-node-js.html

\n

Jor*_*ley 2

你可以用struct.pack这个

\n\n
>>> a =  [67, 97, 102, -61, -87, 32, 70, 108, 111, 114, 97]\n>>> struct.pack("b"*len(a),*a)\n\'Caf\\xc3\\xa9 Flora\'\n>>> print struct.pack("b"*len(a),*a).decode(\'utf8\')\nCaf\xc3\xa9 Flora\n
Run Code Online (Sandbox Code Playgroud)\n