您可以调用编解码器模块来救援。它直接为您提供了一个增量解码器,这正是您所需要的:
import codecs
dec = codecs.getincrementaldecoder('utf8')()
你可以喂它:dec.decode(input)
结束后,可选择添加dec.decode(bytes(), True)
强制它清理任何存储的状态。
测试变成:
>>> def test(arr):
dec = codecs.getincrementaldecoder('utf8')()
recvString = ""
for i in range(len(arr)):
recvString += dec.decode(arr[i:i+1])
sys.stdout.write("%02d : %s\n" % (i, recvString))
recvString += dec.decode(bytes(), True) # will choke on incomplete input...
return recvString == arr.decode('utf8')
>>> testUtf8 = bytes([0x61, 0xc5, 0xbd, 0x6c, 0x75, 0xc5, 0xa5, 0x6f, 0x75, 0xc4, 0x8d, 0x6b, 0xc3, 0xbd, 0x20, 0x6b, 0xc5, 0xaf, 0xc5, 0x88])
>>> test(testUtf8)
00 : a
01 : a
02 : aŽ
03 : aŽl
04 : aŽlu
05 : aŽlu
06 : aŽluť
07 : aŽluťo
08 : aŽluťou
09 : aŽluťou
10 : aŽluťouč
11 : aŽluťoučk
12 : aŽluťoučk
13 : aŽluťoučký
14 : aŽluťoučký
15 : aŽluťoučký k
16 : aŽluťoučký k
17 : aŽluťoučký ků
18 : aŽluťoučký ků
19 : aŽluťoučký kůň
True