从字符串中删除像 '\u0152\xe6' 这样的字符
removing characters like '\u0152\xe6' from string
我正在尝试转换仅包含英文字符、数字和标点符号的字符串,但遇到编码和解码错误。
原字符串为:"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
我该如何解决这个问题?
根据您的问题,我假设您使用 Python 2.7。
错误的原因是:
- 您的源代码不是 UTF-8,几乎可以肯定是 cp1252。
- 在 cp1252 中,'Œ' 字符是字节 '\x8c',该字节在 UTF-8 中无效。
- 您在 'except' 部分指定了 UTF-8 作为解码字符串的编码。
为了更好地理解,请看:
>>> 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。
我正在尝试转换仅包含英文字符、数字和标点符号的字符串,但遇到编码和解码错误。
原字符串为:"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
我该如何解决这个问题?
根据您的问题,我假设您使用 Python 2.7。
错误的原因是:
- 您的源代码不是 UTF-8,几乎可以肯定是 cp1252。
- 在 cp1252 中,'Œ' 字符是字节 '\x8c',该字节在 UTF-8 中无效。
- 您在 'except' 部分指定了 UTF-8 作为解码字符串的编码。
为了更好地理解,请看:
>>> 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。