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

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

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

unicode转义

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

>>> import requests
>>> res = requests.get("https://httpbin.org/get?name=张三&age=12")
>>> print(res.text)
{
  "args": {
    "age": "12",
    "name": "u5f20u4e09"
  },
  "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=u5f20u4e09&age=12"
}

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

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

>>> 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的实际值是”u5f20u4e09″,”u5f20u4e09″ != “u5f20u4e09″,看下如下例子。

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

可见 “u5f20u4e09” 就是”张三”,而”u5f20u4e09″是一个显示为”u5f20u4e09″的字符串。
unicode转义-解码

如何将”u5f20u4e09″转为”张三”呢?方法如下
先按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"xd5xc5xc8xfd"

这个二进制字符串b”xd5xc5xc8xfd”就是”张三”,但如果我们拿到一个”xd5xc5xc8xfd”的普遍字符串呢?
操作方法如下。

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

无论是”xd5xc5xc8xfd”还是”xd5xc5xc8xfd”都可以。

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"
>>>
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » Python中常用的文本转义及编码