Python 删除像'\u0152\xe6';从字符串
我试图用英文字符、数字和标点符号转换字符串,但在编码和解码时遇到错误 原始字符串为:“DD-XBS 2 1/2x 17 LCLŒæ3-pack” 我为解决此问题而编写的代码是: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
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。
错误的原因是:
>>> 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。
错误的原因是:
>>> 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码点,我们可以避免打印,并在匹配后中断循环。