鍍金池/ 問答/Java  Python  網(wǎng)絡(luò)安全/ python如何將二進制串(UTF-8)轉(zhuǎn)換為字符串?

python如何將二進制串(UTF-8)轉(zhuǎn)換為字符串?

已知一個二進制串(UTF-8編碼格式)列表(每一項為一字節(jié)8bit):

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

如何將其轉(zhuǎn)換為字符串呢?

string = ""
for i in b:
    string += chr(int(i,2))
print(string)
#這種方式對應(yīng)純ASCII編碼的字符串是可以的

但UTF-8不可以,我們知道UTF-8是變長的,一個字符通常要占到3個甚至4個字節(jié),上述代碼運行結(jié)果是:

'Python?¤§?3x95'

很明顯因為中文字符占到三個字節(jié),自然每個字節(jié)chr()一次自然會亂碼。那又該如何處理變長的UTF-8編碼呢?

附:
UTF-8編碼方式:
1.對于單字節(jié)的符號,字節(jié)的第一位設(shè)為0,后面7位為這個符號的unicode碼。因此對于英語字母, UTF-8編碼和ASCII碼是相同的。
2.對于n字節(jié)的符號(n>1),第一個字節(jié)的前n位都設(shè)為1,第n+1位設(shè)為0,后面字節(jié)的前兩位一律設(shè)為10。剩下的沒有提及的二進制位,全部為這個符號的unicode碼。

其他的一些相關(guān)問題:
https://segmentfault.com/q/10...
https://segmentfault.com/q/10...

這里我想到一個處理多字節(jié)UTF-8的思路,大家看看是否可行:
(循環(huán))當(dāng)檢測到一項的前兩位是"11"時,用正則提出前面的所有1,即這個字符所占字節(jié)數(shù),然后找到后面的字節(jié),去掉10,然后將這幾個字節(jié)去掉前面的部分("1110"/"10")后剩下的合并,就是這個字符對應(yīng)的Unicode編碼了,然后chr(int(i,2))。

那么請教大家,這樣的思路該如何實現(xiàn)?或者各路大神有什么簡便算法呢?抑或是有相關(guān)模塊可以做這樣的處理呢?(初入勿怪)

回答
編輯回答
厭惡我

python3

bytes([int(x,2) for x in b]).decode('utf-8')
2017年2月28日 18:15
編輯回答
乖乖噠

這個可能和操作系統(tǒng)或Python版本有關(guān), 到少在我的機器上你的代碼是可以的

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大法
2017年11月26日 11:06