Python 删除像'\u0152\xe6';从字符串

Python 删除像'\u0152\xe6';从字符串,python,python-2.7,python-unicode,Python,Python 2.7,Python Unicode,我试图用英文字符、数字和标点符号转换字符串,但在编码和解码时遇到错误 原始字符串为:“DD-XBS 2 1/2x 17 LCLŒæ3-pack” 我为解决此问题而编写的代码是: try: each = str(each.decode('ascii')) except UnicodeDecodeError: each = str(each.decode('utf-8').encode('ascii', errors='ignore')) 但我得到了一个错误: UnicodeDec

我试图用英文字符、数字和标点符号转换字符串,但在编码和解码时遇到错误

原始字符串为:“DD-XBS 2 1/2x 17 LCLŒæ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
>>> u = '\x8c'.decode('utf-8')
...
UnicodeDecodeError: 'utf8' codec can't decode byte 0x8c ...

如何解决这个问题?

正如您的问题所示,我假设您使用的是Python 2.7。


错误的原因是:

  • 您的源代码不是UTF-8,几乎可以肯定是cp1252。
  • 在cp1252中,“Œ”字符是字节“\x8c”,该字节在UTF-8中无效。
  • 您指定UTF-8作为“除外”部分中解码字符串的编码。 为了更好地理解这一点,请查看:

    >>> u = '\x8c'.decode('cp1252')
    >>> u
    u'\u0152'
    
    因此,当我们用cp1252解码“\x8c”字节时,有一个Unicode码点,即:

    >>> import unicodedata 
    >>> unicodedata.name(u)
    'LATIN CAPITAL LIGATURE OE' 
    
    但是,如果我们尝试使用UTF-8进行解码,我们将得到一个错误:

    UnicodeDecodeError: 'utf8' codec can't decode byte 0x8c in position 16: invalid start byte
    
    >>> 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Œ230; 3-pack'
    ascii_str=''
    如需登录my_str:
    如果ord(符号)<128:
    ascii_str+=符号
    打印(ascii_str)#DD-XBS 2 1/2x 17 LCL 3包
    


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

    正如您的问题所述,我假设您使用的是Python 2.7。


    错误的原因是:

  • 您的源代码不是UTF-8,几乎可以肯定是cp1252。
  • 在cp1252中,“Œ”字符是字节“\x8c”,该字节在UTF-8中无效。
  • 您指定UTF-8作为“除外”部分中解码字符串的编码。 为了更好地理解这一点,请查看:

    >>> u = '\x8c'.decode('cp1252')
    >>> u
    u'\u0152'
    
    因此,当我们用cp1252解码“\x8c”字节时,有一个Unicode码点,即:

    >>> import unicodedata 
    >>> unicodedata.name(u)
    'LATIN CAPITAL LIGATURE OE' 
    
    但是,如果我们尝试使用UTF-8进行解码,我们将得到一个错误:

    UnicodeDecodeError: 'utf8' codec can't decode byte 0x8c in position 16: invalid start byte
    
    >>> 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Œ230; 3-pack'
    ascii_str=''
    如需登录my_str:
    如果ord(符号)<128:
    ascii_str+=符号
    打印(ascii_str)#DD-XBS 2 1/2x 17 LCL 3包
    


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

    我在ipython中尝试了您的代码,没有得到任何错误。@pnv python 2.7或3.x?我使用了python2.7我在ipython中尝试了您的代码,没有得到任何错误。@pnv python 2.7或3.x?我只使用了python2.7一个问题。您是如何确定其编码为“cp1252”的?有什么方法可以做到这一点吗?从错误报告和“Œ”字符视图中,我猜测实际编码是最常见的西欧编码之一。然后我使用
    print('\x8c'.decode('cp1252'))
    等检查了在cp1252、latin_1和mac_roman中解码后“\x8c”字节的外观。只有cp1252解码视图匹配。所以,为了检测正确的编码,当我们有一个char视图和它的字节值时,我建议创建一个可能的编码列表,并通过该列表在循环中打印解码的字节。另外,如果我们知道字符的Unicode编码点,我们可以避免打印并在匹配后中断循环。只有一个问题。您是如何确定其编码为“cp1252”的?有什么方法可以做到这一点吗?从错误报告和“Œ”字符视图中,我猜测实际编码是最常见的西欧编码之一。然后我使用
    print('\x8c'.decode('cp1252'))
    等检查了在cp1252、latin_1和mac_roman中解码后“\x8c”字节的外观。只有cp1252解码视图匹配。所以,为了检测正确的编码,当我们有一个char视图和它的字节值时,我建议创建一个可能的编码列表,并通过该列表在循环中打印解码的字节。此外,如果我们知道字符的Unicode码点,我们可以避免打印,并在匹配后中断循环。