python如何将二进制串(UTF-8)转换为字符串?

新手上路,请多包涵

已知一个二进制串(UTF-8编码格式)列表(每一项为一字节8bit):

b=['01010000', '01111001', '01110100', '01101000', '01101111', '01101110', '11100101', '10100100', '10100111', '11100110', '10110011', '10010101']
#即字符串"Python大法"

如何将其转换为字符串呢?

string = ""
for i in b:
    string += chr(int(i,2))
print(string)
#这种方式对应纯ASCII编码的字符串是可以的

但UTF-8不可以,我们知道UTF-8是变长的,一个字符通常要占到3个甚至4个字节,上述代码运行结果是:

'Python大æ³x95'

很明显因为中文字符占到三个字节,自然每个字节chr()一次自然会乱码。那又该如何处理变长的UTF-8编码呢?

附:
UTF-8编码方式:
1.对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母, UTF-8编码和ASCII码是相同的。
2.对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

其他的一些相关问题:
https://segmentfault.com/q/10...
https://segmentfault.com/q/10...

这里我想到一个处理多字节UTF-8的思路,大家看看是否可行:
(循环)当检测到一项的前两位是"11"时,用正则提出前面的所有1,即这个字符所占字节数,然后找到后面的字节,去掉10,然后将这几个字节去掉前面的部分("1110"/"10")后剩下的合并,就是这个字符对应的Unicode编码了,然后chr(int(i,2))。

那么请教大家,这样的思路该如何实现?或者各路大神有什么简便算法呢?抑或是有相关模块可以做这样的处理呢?(初入勿怪)

阅读 7.8k
2 个回答

python3

bytes([int(x,2) for x in b]).decode('utf-8')

这个可能和操作系统或Python版本有关, 到少在我的机器上你的代码是可以的

b=['01010000', '01111001', '01110100', '01101000', '01101111', '01101110', '11100101', '10100100', '10100111', '11100110', '10110011', '10010101']


def b2c(b):
    return int(b,2)

print( "".join(map(chr,map(b2c, b))))

会输出

Python大法
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题