1. 程式人生 > 其它 >Python中常用的文字轉義及編碼

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