百木园-与人分享,
就是让自己快乐。

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\'
>>>

来源:https://www.cnblogs.com/djdjdj123/p/15956770.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » Python中常用的文本转义及编码

相关推荐

  • 暂无文章