已知一个二进制串(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))。
那么请教大家,这样的思路该如何实现?或者各路大神有什么简便算法呢?抑或是有相关模块可以做这样的处理呢?(初入勿怪)
python3