【问题标题】:Remove bad character "\xC2" python string删除坏字符 "\xC2" python 字符串
【发布时间】:2016-02-12 11:39:39
【问题描述】:

我有下一个代码:

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()))

在python 2中,结果是:

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: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,为什么当我尝试这样做时第二个字节也会被删除?

【问题讨论】:

    标签: python string python-3.x hex character


    【解决方案1】:

    问题在于 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
    

    【讨论】:

    • 非常感谢,它解决了问题。我不知道python2和python3之间的这个小区别。再次感谢。
    【解决方案2】:

    您可以通过编码为 ISO 8859-1 将前 256 个字符中的文本转换为其原始字节值。

    3>> '\x80'.encode('latin-1')
    b'\x80'
    

    【讨论】:

    • 感谢您的回复。最后,应用@J.F.Sebastian 建议的解决方案解决了问题。具体来说,python2 和 python3 将相同的变量作为不同的事物管理(第一个作为 Unicode,第二个作为字节)。
    猜你喜欢
    • 1970-01-01
    • 2011-05-12
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多