Tim*_*tri 5 python arrays utf-8 python-2.7
我有一个表示 utf-8 编码字符串的字节数组。我想将这些字节解码回 Pyton2 中的字符串。我的整个程序依赖Python2,所以我无法切换到Python3。
\n\narray = [67, 97, 102, **-61, -87**, 32, 70, 108, 111, 114, 97] \nRun Code Online (Sandbox Code Playgroud)\n\n-> 咖啡馆\xc3\xa9弗洛拉
\n\n由于我想要的字符串中的每个字符不一定由数组中的 1 个字节表示,因此我不能使用如下解决方案:
\n\n"".join(map(chr, array))\nRun Code Online (Sandbox Code Playgroud)\n\n我尝试创建一个函数来逐步遍历数组,每当遇到不在 0-127 (ASCII) 范围内的数字时,创建一个新的 16 位 int,将当前位向左移动 8 以上,然后添加使用按位或运算来计算后面的字节。最后它会使用 unichr() 对其进行解码。
\n\nresult = []\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)\nRun Code Online (Sandbox Code Playgroud)\n\n然而,这并没有成功。
\n\n下面的文章很好地解释了这个问题,并包含了一个nodeJS解决方案:
\n\nhttp://ixti.net/development/node.js/2011/10/26/get-utf-8-string-from-array-of-bytes-in-node-js.html
\n你可以用struct.pack这个
>>> 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\nRun Code Online (Sandbox Code Playgroud)\n