python解码部分utf-8字节数组

Vit*_*tik 1 python utf-8

我从通道获取的数据不知道UTF-8规则.因此,有时当UTF-8使用多个字节来编码一个字符时,我尝试将部分接收的数据转换为文本,我在转换过程中遇到错误.根据接口的性质(没有任何结束的流)我无法找出数据何时已满.因此,我需要处理部分utf-8解码.基本上我需要解码我可以存储的部分数据.存储的部分数据将作为前缀添加到下一个数据.我的问题是如果在python中有一些简洁的功能允许它吗?

[编辑]只是为了确保您了解docs.python中的功能

 bytes.decode(encoding="utf-8", errors="ignore")
Run Code Online (Sandbox Code Playgroud)

但问题是它不会返回我的错误在哪里,所以我不知道从最后我将保留多少字节.

Ser*_*sta 7

您可以调用编解码器模块进行救援.它直接为您提供增量解码器,完全满足您的需求:

import codecs

dec = codecs.getincrementaldecoder('utf8')()
Run Code Online (Sandbox Code Playgroud)

你可以用它来提供它: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
Run Code Online (Sandbox Code Playgroud)