关于python字符串编码问题

关于python字符串编码问题

一,encode和decode

  • 1,python默认字符串是使用Unicode编码。

  • 2,encode作用是将Unicode编码转换成其他编码的字符串。

  • 3,decode是将其他编码的字符串解码为Unicode编码。

  • 4,实例

    unicode_str = "我们是unicode编码"
    print(type(unicode_str))
    # unicode_str进行编码为utf-8编码
    utf8_str = unicode_str.encode("utf-8")
    print(type(utf8_str))
    # 一个Unicode字符被转换为3个UTF-8编码的bytes对象
    print(utf8_str)
    # 进行解码为Unicode码
    unicode_end_str = utf8_str.decode("utf-8")
    print(type(unicode_end_str))
    print(unicode_end_str)
    
  • 结果如下:

    <class 'str'>
    <class 'bytes'>
    b'xe6x88x91xe4xbbxacxe6x98xafunicodexe7xbcx96xe7xa0x81'
    <class 'str'>
    我们是unicode编码
    
  • 注意:Unicode编码在python中不能再进行解码。而除了Unicode编码不能继续编码,也就是说,如果你已经将Unicode转换为utf-8编码,则不能继续使用encode编码

二,关于不同编码之间的转换

  • 1,上面说过,不能连续编码,所以不同编码之间的转换只能先将其他编码解码为Unicode编码,然后再编码为其他编码

  • 2,实例,将utf-8编码转换为gbk编码

    unicode_str = "我"
    
    # 先获取utf-8编码的字符串
    # 编码为utf-8编码
    utf8_str = unicode_str.encode("utf-8")
    print("我是utf_str:", utf8_str, "type:", type(utf8_str))
    # 解码为Unicode
    unicode_str = utf8_str.decode("utf-8")
    print("我是unicode_str:", unicode_str, "type:", type(unicode_str))
    # 将uncoide编码为gbk
    gbk_str = unicode_str.encode("gbk")
    print("我是gbk_str:", gbk_str, "type:", type(gbk_str))
    # 这样
    # 就完成了不同编码的转换
    
  • 结果:

    我是utf_str: b'xe6x88x91' type: <class 'bytes'>
    我是unicode_str:type: <class 'str'>
    我是gbk_str: b'xcexd2' type: <class 'bytes'>
    

三,当一个字符串中既有中文又有英文时,有些编码会出错,比如assic编码

  • 实例:

    str = "我是Unicode编码"
    assic_str = str.encode("ASCII")
    
  • 当我们尝试给中文使用ascii编码时会报错

    Traceback (most recent call last):
      File "C:/Users/26398/Desktop/python/爬虫/存储/strdemo3.py", line 2, in <module>
        assic_str = str.encode("ASCII")
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
    
    
  • 在爬虫处理中,也会出现混合编码的情况,处理方式是进行错误处理

    str = "我是Unicode编码"
    """
    默认为strict: 非法字符抛出异常
    ignore: 忽略非法字符,不进行转换
    replace: 使用?进行替换非法字符
    xmlcharrefreplace:使用xml字符引用替代非法字符
    
    """
    assic_str = str.encode("ASCII", errors='ignore')
    print(assic_str)
    assic_str = str.encode("ASCII", errors='replace')
    print(assic_str)
    assic_str = str.encode("ASCII", errors='xmlcharrefreplace')
    print(assic_str)
    
    

    结果:

    b'Unicode'
    b'??Unicode??'
    b'&#25105;&#26159;Unicode&#32534;&#30721;'
    
原文地址:https://www.cnblogs.com/jlxa162hhf/p/14161233.html