2017-01-04 1 views
1

Мне нужно декодировать последовательность UTF-8, которая хранится в bytearray, в строку.Как разрешительно декодировать UTF-8 bytearray?

Последовательность UTF-8 может содержать ошибочные части. В этом случае мне нужно как можно больше расшифровать и (необязательно?) Заменить недопустимые части чем-то вроде «?».

# First part decodes to "ABÄC" 
b = bytearray([0x41, 0x42, 0xC3, 0x84, 0x43]) 
s = str(b, "utf-8") 
print(s) 

# Second part, invalid sequence, wanted to decode to something like "AB?C" 
b = bytearray([0x41, 0x42, 0xC3, 0x43]) 
s = str(b, "utf-8") 
print(s) 

Каков наилучший способ достичь этого в Python 3?

ответ

1

Есть несколько встроенной обработки ошибок schemes для кодирования и декодирования str и из bytes и bytearray с, например, bytearray.decode(). Например:

>>> b = bytearray([0x41, 0x42, 0xC3, 0x43]) 

>>> b.decode('utf8', errors='ignore') # discard malformed bytes 
'ABC' 

>>> b.decode('utf8', errors='replace') # replace with U+FFFD 
'AB�C' 

>>> b.decode('utf8', errors='backslashreplace') # replace with backslash-escape 
'AB\\xc3C' 

Кроме того, вы можете написать свой собственный обработчик ошибок иэто:

import codecs 

def my_handler(exception): 
    """Replace unexpected bytes with '?'.""" 
    return '?', exception.end 

codecs.register_error('my_handler', my_handler) 

>>> b.decode('utf8', errors='my_handler') 
'AB?C' 

Все эти схемы обработки ошибок также может быть использован с str() конструктору в вашем вопросе:

>>> str(b, 'utf8', errors='my_handler') 
'AB?C' 

... хотя это более идиоматических использовать явно str.decode().

Смежные вопросы