Skip to main content
 首页 » 编程设计

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

2025年05月04日13grandyang

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

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

 bytes.decode(encoding="utf-8", errors="ignore") 

但问题是它不会返回错误在哪里,所以我不知道我应该保留多少字节。

请您参考如下方法:

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

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