• Python中常用的文本转义及编码


    每种语言都有其关键字和保留字符,这样为了能这些特殊字符能正常显示,就需要转义,如Python中\n代表回车,HTML中 代表空格等等。
    Python中的''是转义控制符,如果要表达\本身则需要使用'',常见于Windows系统的路径中(使用'/'则不需要转义)。

    unicode转义

    有时候我们在响应文本中会看到一些\u开头的字符串,如下例。

    >>> import requests
    >>> res = requests.get('https://httpbin.org/get?name=张三&age=12')
    >>> print(res.text)
    {
      "args": {
        "age": "12",
        "name": "\u5f20\u4e09"
      },
      "headers": {
        "Accept": "*/*",
        "Accept-Encoding": "gzip, deflate",
        "Host": "httpbin.org",
        "User-Agent": "python-requests/2.24.0",
        "X-Amzn-Trace-Id": "Root=1-5f8f8e42-6d1f34a2691b8bec579454a3"
      },
      "origin": "111.194.126.253",
      "url": "https://httpbin.org/get?name=\u5f20\u4e09&age=12"
    }
    

    响应体文本中,name后面对应是"\u5f20\u4e09",这是HTTP请求在传输时为了确保符合ASCII编码对其他字符集做的unicode转义。

    注意这个只是打印结果,我们看看res.text的本来样子。

    >>> res.text
    '{\n  "args": {\n    "age": "12", \n    "name": "\\u5f20\\u4e09"\n  }, \n  "headers": {\n    "Accept": "*/*", \n    "Accept-Encoding": "gzip, deflate", \n    "Host": "httpbin.org", \n    "User-Agent": "python-requests/2.24.0", \n    "X-Amzn-Trace-Id": "Root=1-5f8f8e42-6d1f34a2691b8bec579454a3"\n  }, \n  "origin": "111.194.126.253", \n  "url": "https://httpbin.org/get?name=\\u5f20\\u4e09&age=12"\n}\n'
    

    可以看出name的实际值是"\u5f20\u4e09","\u5f20\u4e09" != "\u5f20\u4e09",看下如下例子。

    >>> name = "\u5f20\u4e09"
    >>> name
    '张三'
    >>> name = "\\u5f20\\u4e09"
    >>> name
    '\\u5f20\\u4e09'
    >>> print(name)
    \u5f20\u4e09
    

    可见 "\u5f20\u4e09" 就是"张三",而"\u5f20\u4e09"是一个显示为"\u5f20\u4e09"的字符串。
    unicode转义-解码

    如何将"\u5f20\u4e09"转为"张三"呢?方法如下
    先按utf-8编码回二进制,然后按unicode-escape方式解码为正常文本

    >>> name = "\\u5f20\\u4e09"
    >>> name.encode('utf-8').decode('unicode-escape') 
    '张三'
    

    unicode转义-编码

    如果想将"张三"转为unicode转义字符只需要反向操作即可。

    >>> name = "张三"
    >>> name.encode('unicode-escape').decode('utf-8')
    '\\u5f20\\u4e09'
    

    GBK转义

    有些中文网页中有时会使用GBK编码,形式为\x开头的字符如。

    >>> name = "张三"
    >>> name.encode('gbk')
    b'\xd5\xc5\xc8\xfd'
    

    这个二进制字符串b'\xd5\xc5\xc8\xfd'就是"张三",但如果我们拿到一个"\xd5\xc5\xc8\xfd"的普遍字符串呢?
    操作方法如下。

    >>> name = "\xd5\xc5\xc8\xfd"
    >>> name
    'ÕÅÈý'
    >>> name.encode('latin1').decode('unicode-escape').encode('latin1').decode('gbk')
    '张三'
    >>> name = "\\xd5\xc5\\xc8\\xfd"
    >>> name.encode('latin1').decode('unicode-escape').encode('latin1').decode('gbk')
    '张三'
    

    无论是"\xd5\xc5\xc8\xfd"还是"\xd5\xc5\xc8\xfd"都可以。

    html转义

    在有些情况下我们需要解码html文档中的转义字符,或者进行编码,操作如下。

    >>> import html
    >>> args='{"e": 5, "f": 6}'
    >>> html.escape(args)  # 转义
    '{"e": 5, "f": 6}'
    >>> html.unescape('{"e": 5, "f": 6}')   # 转回
    '{"e": 5, "f": 6}'
    

    url编码

    在url中需要对一些特殊字符进行编码,比如在浏览器地址栏中输入https://httpbin.org/get?name=张三&age=12'
    然后复制-粘贴,你会发现网址变为了https://httpbin.org/get?name=%E5%BC%A0%E4%B8%89&age=12,这就是url为确保ASCII对特殊字符集非ASCII编码进行的编码。

    如何解码呢?方法如下。

    >>> from urllib.parse import quote,unquote,urlencode
    >>> url = 'https://httpbin.org/get?name=%E5%BC%A0%E4%B8%89&age=12'
    >>> unquote(url)
    'https://httpbin.org/get?name=张三&age=12'
    

    如果想要进行urlencode编码,则需要使用quote和urlencode,quote对字符串进行编码,一般只用于单个参数值,urlencode则对一组字典格式的参数进行编码组装。
    示例如下:

    >>> name = "张三"
    >>> quote(name)
    '%E5%BC%A0%E4%B8%89'
    >>> url = f'https://httpbin.org/get?name={name}&age=12'
    >>> url
    'https://httpbin.org/get?name=张三&age=12'
    >>>
    

    >>> params = {"name": "张三", "age": 12}
    >>> urlencode(params)
    'name=%E5%BC%A0%E4%B8%89&age=12'
    >>> url = f'https://httpbin.org/get?{urlencode(params)}'
    >>> url
    'https://httpbin.org/get?name=%E5%BC%A0%E4%B8%89&age=12'
    

    base64编码

    编码和加密的不同在于,编码一般为了传输或者压缩,支持解码。加密后则一般不能反解。
    base64一般用于在接口中,将图片或媒体变为一种固定长度的字符串形式,方便传输。
    base64编码解码方法如下。
    编码

    '''
    学习中遇到问题没人解答?小编创建了一个Python学习交流群:531509025
    寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
    '''
    >>> import base64
    >>> a = 'lts'
    >>> b =a.encode('utf-8')
    >>> base64.b64encode(b)
    b'bHRz'
    >>> base64.b64encode(b).decode('utf-8')
    'bHRz'
    

    解码

    >>> base64.b64decode('bHRz').decode('utf-8')
    'lts'
    >>> base64.b64decode(b'bHRz').decode('utf-8')
    'lts'
    >>>
    
  • 相关阅读:
    栏目调用 sql语句
    一场豪赌 微软的未来取决于Windows 8
    mark
    [导入].net中的如何私有部署强命名组件
    q160问题,www.q160.com,ie被篡改
    解决jdgui保存源码自动添加注释的情况
    汉诺塔问题
    软件测试 方法总结
    javascript 基础篇4 window对象,DOM
    javascript 进阶篇1 正则表达式,cookie管理,userData
  • 原文地址:https://www.cnblogs.com/djdjdj123/p/15956770.html
Copyright © 2020-2023  润新知