删除坏字符 "\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