删除坏字符 "\xC2" python 字符串
Remove bad character "\xC2" python string
我有下一个代码:
string_msg = '\x80\x01\x00\x00\x00\x00\x53\x58\x00\x1C\x00\x00\x00\x08\x00\x01\x00\x74\x00\x00\x00\x0A\x00\x54\x00\x00\x00\x03'
print(string_msg)
if sys.version < '3':
print(":".join("{:02x}".format(ord(c)) for c in string_msg))
else:
print(":".join("{:02x}".format(c) for c in string_msg.encode()))
在python2中,结果为:
80:01:00:00:00:00:53:58:00:1c:00:00:00:08:00:01:00:74:00:00:00:0a:00:54:00:00:00:03
但是在python3中,结果是:
c2:80:01:00:00:00:00:53:58:00:1c:00:00:00:08:00:01:00:74:00:00:00:0a:00:54:00:00:00:03
现在我需要在 python 3 中执行这段代码,所以我必须删除开头的第一个字节才能删除 "c2" 一切都会好起来的,但我正在尝试使用我在该论坛中找到的太多代码来执行此操作,例如:
string_msg = string_msg[1:]
string_msg.replace('\xC2', '')
string_msg = ''.join([i if ord(i) < 130 else '' for i in string_msg])
结果总是一样的:
01:00:00:00:00:53:58:00:1c:00:00:00:08:00:01:00:74:00:00:00:0a:00:54:00:00:00:03
同时删除第二个字节 80
,所以我的问题是:我怎样才能只删除第一个字节 c2
以及为什么当我尝试这样做时第二个字节也被删除了?
您可以通过编码为 ISO 8859-1 将前 256 个字符的文本转换为其原始字节值。
3>> '\x80'.encode('latin-1')
b'\x80'
问题是 string_msg
是 Python 2 上的字节串,尽管看起来相同,但它是 Python 3 上的 Unicode 字符串——一个字节 b'\x80'
是与 Unicode 代码点完全不同的概念 u'\x80'
:相同的 Unicode 代码点可以使用不同编码中的不同字节表示,反之亦然,同一字节可以表示不同编码中的不同字符。
如果 string_msg
是字节序列,则使用 b''
文字:
data = b'\x80\x01\x00\x00\x00\x00\x53\x58\x00\x1C\x00\x00\x00\x08'
print(":".join(map("{:02x}".format, bytearray(data))))
# -> 80:01:00:00:00:00:53:58:00:1c:00:00:00:08
我有下一个代码:
string_msg = '\x80\x01\x00\x00\x00\x00\x53\x58\x00\x1C\x00\x00\x00\x08\x00\x01\x00\x74\x00\x00\x00\x0A\x00\x54\x00\x00\x00\x03'
print(string_msg)
if sys.version < '3':
print(":".join("{:02x}".format(ord(c)) for c in string_msg))
else:
print(":".join("{:02x}".format(c) for c in string_msg.encode()))
在python2中,结果为:
80:01:00:00:00:00:53:58:00:1c:00:00:00:08:00:01:00:74:00:00:00:0a:00:54:00:00:00:03
但是在python3中,结果是:
c2:80:01:00:00:00:00:53:58:00:1c:00:00:00:08:00:01:00:74:00:00:00:0a:00:54:00:00:00:03
现在我需要在 python 3 中执行这段代码,所以我必须删除开头的第一个字节才能删除 "c2" 一切都会好起来的,但我正在尝试使用我在该论坛中找到的太多代码来执行此操作,例如:
string_msg = string_msg[1:]
string_msg.replace('\xC2', '')
string_msg = ''.join([i if ord(i) < 130 else '' for i in string_msg])
结果总是一样的:
01:00:00:00:00:53:58:00:1c:00:00:00:08:00:01:00:74:00:00:00:0a:00:54:00:00:00:03
同时删除第二个字节 80
,所以我的问题是:我怎样才能只删除第一个字节 c2
以及为什么当我尝试这样做时第二个字节也被删除了?
您可以通过编码为 ISO 8859-1 将前 256 个字符的文本转换为其原始字节值。
3>> '\x80'.encode('latin-1')
b'\x80'
问题是 string_msg
是 Python 2 上的字节串,尽管看起来相同,但它是 Python 3 上的 Unicode 字符串——一个字节 b'\x80'
是与 Unicode 代码点完全不同的概念 u'\x80'
:相同的 Unicode 代码点可以使用不同编码中的不同字节表示,反之亦然,同一字节可以表示不同编码中的不同字符。
如果 string_msg
是字节序列,则使用 b''
文字:
data = b'\x80\x01\x00\x00\x00\x00\x53\x58\x00\x1C\x00\x00\x00\x08'
print(":".join(map("{:02x}".format, bytearray(data))))
# -> 80:01:00:00:00:00:53:58:00:1c:00:00:00:08