美文网首页
python 解码字节流 decode bytes

python 解码字节流 decode bytes

作者: 生活就是爱 | 来源:发表于2020-06-07 10:17 被阅读0次

    之前使用python解码二进制字节流,遇到各种各样的bug,现在对各种问题进行总结记录

    一. 解码报错:'utf-8' codec can't decode byte

    1.bug再现

    已知字节流生成时采用utf8编码,但是解码时莫名出现乱码,如下:

    text = b'\x00\x00\t\x00\x00\x002\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[\x00\x00\x00n\x00\x00\x00p\x0b\xe2\x01\x00\x00\x00\x00 [9\x0b`\x7f\x00\x00'
    text = text.decode()
    print("text:", text)
    
    ---------------------------------------------------------------------------
    UnicodeDecodeError                        Traceback (most recent call last)
    <ipython-input-115-e6b2c457ec24> in <module>()
          1 text = b'\x00\x00\t\x00\x00\x002\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[\x00\x00\x00n\x00\x00\x00p\x0b\xe2\x01\x00\x00\x00\x00 [9\x0b`\x7f\x00\x00'
    ----> 2 text = text.decode()
          3 print("text:", text)
    
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe2 in position 36: invalid continuation byte
    

    2. str.decode()语法

    decode()方法语法:

    str.decode(encoding='UTF-8',errors='strict')
    
    参数:
    encoding -- 要使用的编码,默认"UTF-8",其余还有"gbk","unicode_escape","ascii","base64"等
    
    errors -- 设置不同错误的处理方案。默认为 'strict',意为编码错误引起一个UnicodeError。 
    其余还有 'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace' 以及通过 codecs.register_error() 注册的任何值。
    

    下面代码采用不同的errorsencode带有特殊字符的字符串,有兴趣的同学可以尝试下,感受区别

    txt = "My name is Ståle"
    
    # print(txt.encode(encoding="ascii",errors="backslashreplace"))
    # print(txt.encode(encoding="ascii",errors="ignore"))
    # print(txt.encode(encoding="ascii",errors="namereplace"))
    # print(txt.encode(encoding="ascii",errors="replace"))
    # print(txt.encode(encoding="ascii",errors="xmlcharrefreplace"))
    print(txt.encode(encoding="ascii",errors="strict"))
    

    3. 解决解码报错的bug

    了解了这些,上面的bug表面上就很好解决了,直接设置errors的方式就可以了

    text = b'\x00\x00\t\x00\x00\x002\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[\x00\x00\x00n\x00\x00\x00p\x0b\xe2\x01\x00\x00\x00\x00 [9\x0b`\x7f\x00\x00'
    text = text.decode("utf8", "ignore")
    print("text:", text)
    

    二、去除解码后的空白占位符

    python中去除空白字符的方式有很多种,各种方式似乎没有太大差别,今天做了各种尝试,做一个记录
    先看一下去除前的效果

    text = b'2020-06-02 13:49:13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x00\x00\x00\x00\x00\x00\x00\xf0\xa9'
    text = text.decode("utf8", "ignore")
    print(len(text), text, sep=">>>", end=">>>")
    
    ---------------------------------------------------------------------------
    47>>>2020-06-02 13:49:13>>>
    

    1.strip

    text = b'2020-06-02 13:49:13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x00\x00\x00\x00\x00\x00\x00\xf0\xa9'
    text = text.decode("utf8", "ignore").strip("\x00")
    print(len(text), text, sep=">>>", end=">>>")
    
    ---------------------------------------------------------------------------
    19>>>2020-06-02 13:49:13>>>
    

    2. replace

    text = b'2020-06-02 13:49:13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x00\x00\x00\x00\x00\x00\x00\xf0\xa9'
    text = text.decode("utf8", "ignore").replace("\x00", "")
    print(len(text), text, sep=">>>", end=">>>")
    
    ---------------------------------------------------------------------------
    19>>>2020-06-02 13:49:13>>>
    

    3. split

    text = b'2020-06-02 13:49:13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x86\x00\x00\x00\x00\x00\x00\x00\xf0\xa9'
    text = ''.join(text.decode("utf8", "ignore").split("\x00"))
    print(len(text), text, sep=">>>", end=">>>")
    
    ---------------------------------------------------------------------------
    19>>>2020-06-02 13:49:13>>>
    

    编码正常的情况下,上述三个方法看起来都没什么问题,都能达到想要的结果,权且先记录下来

    参考资料:
    菜鸟教程:python decode()方法
    w3school:python字符串encode()方法
    Python encode()和decode()方法:字符串编码转换
    python 字符串去空格

    相关文章

      网友评论

          本文标题:python 解码字节流 decode bytes

          本文链接:https://www.haomeiwen.com/subject/lbngzhtx.html