2017-01-04 15 views
1

我需要將存儲在字節數組中的UTF-8序列解碼爲字符串。如何許可解碼UTF-8字節數組?

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和從bytesbytearray用例如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' 

此外,您可以編寫自己的錯誤處理程序和register它:

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()

相關問題