2016-11-09 59 views
2

我试图从我的字符串中删除十六进制字符\xef\xbb\xbf但是我收到以下错误。从unicode对象中删除十六进制字符

不太清楚如何解决这个问题。

>>> x = u'\xef\xbb\xbfHello' 
>>> x 
u'\xef\xbb\xbfHello' 
>>> type(x) 
<type 'unicode'> 
>>> print x 
Hello 
>>> print x.replace('\xef\xbb\xbf', '') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 0: ordinal not in range(128) 
>>> 

回答

3

您需要更换unicode的对象,否则将Python2尝试编码x与ASCII编码解码器来搜索它的一个str

>>> x = u'\xef\xbb\xbfHello' 
>>> x 
u'\xef\xbb\xbfHello' 
>>> print(x.replace(u'\xef\xbb\xbf',u'')) 
Hello 

这只适用于Python2。 在Python3中,两个版本都可以工作。

0

真正的问题是,你的Unicode字符串被错误地解码首先。这些字符是一个UTF-8字节顺序标记(BOM)字符,被解码为(可能是)latin-1或cp1252。

理想的情况下,确定他们是如何解码的,但你可以通过重新编码为latin1的解码正确扭转错误:

>>> x = u'\xef\xbb\xbfHello' 
>>> x.encode('latin1').decode('utf8') # decode correctly, U+FEFF is a BOM. 
u'\ufeffHello' 
>>> x.encode('latin1').decode('utf-8-sig') # decode and handle BOM. 
u'Hello' 
相关问题