从字符串中删除'\ u0152 \ xe6'等字符

时间:2017-10-17 13:09:10

标签: python python-2.7 python-unicode

我正在尝试使用英文字符,数字和标点符号转换字符串,但面临编码和解码错误。

原始字符串是:“DD-XBS 2 1 / 2x17LCLŒæ3-pack”

我为解决这个问题而撰写的代码是:

try:
    each = str(each.decode('ascii'))
except UnicodeDecodeError:
    each = str(each.decode('utf-8').encode('ascii', errors='ignore'))

但是我收到了一个错误:

UnicodeDecodeError: 'utf8' codec can't decode byte 0x8c in position 16: invalid start byte

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

从您的问题开始,我假设您使用的是Python 2.7。


错误的原因是:

  1. 您的源代码不是UTF-8,几乎可以肯定是在cp1252中。
  2. 在cp1252中,'Œ'字符是字节'\ x8c',该字节在UTF-8中无效。
  3. 您指定了UTF-8作为解码'except'部分中字符串的编码。

为了更好地理解,请查看:

>>> u = '\x8c'.decode('cp1252')
>>> u
u'\u0152'

因此,当我们用cp1252解码'\ x8c'字节时,有一个Unicode代码点,即:

>>> import unicodedata 
>>> unicodedata.name(u)
'LATIN CAPITAL LIGATURE OE' 

但是,如果我们尝试使用UTF-8解码,我们会收到错误:

>>> u = '\x8c'.decode('utf-8')
...
UnicodeDecodeError: 'utf8' codec can't decode byte 0x8c ...

因此,'\ x8c'字节和UTF-8编码不兼容。


要修复问题,您可以尝试:

each = str(each.decode('cp1252').encode('ascii', errors='ignore'))

或者这个:

each = str(each.decode('utf-8', errors='ignore').encode('ascii', errors='ignore'))

同样在你的情况下你可以使用ord():

my_str = 'DD-XBS 2 1/2x 17 LCLξ 3-pack'
ascii_str = ''

for sign in my_str:
    if ord(sign) < 128:
        ascii_str += sign

print(ascii_str) # DD-XBS 2 1/2x 17 LCL 3-pack


但可能最好的解决方案就是将源转换为UTF-8。