Python中常用的文本轉(zhuǎn)義及編碼

每種語言都有其關(guān)鍵字和保留字符,這樣為了能這些特殊字符能正常顯示麻掸,就需要轉(zhuǎn)義酥夭,如Python中\n代表回車,HTML中 代表空格等等脊奋。
Python中的''是轉(zhuǎn)義控制符熬北,如果要表達(dá)\本身則需要使用'\',常見于Windows系統(tǒng)的路徑中(使用'/'則不需要轉(zhuǎn)義)诚隙。

unicode轉(zhuǎn)義

有時(shí)候我們在響應(yīng)文本中會看到一些\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"
}

響應(yīng)體文本中久又,name后面對應(yīng)是"\u5f20\u4e09"巫延,這是HTTP請求在傳輸時(shí)為了確保符合ASCII編碼對其他字符集做的unicode轉(zhuǎn)義效五。
注意這個(gè)只是打印結(jié)果,我們看看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的實(shí)際值是"\\u5f20\\u4e09"畏妖,"\u5f20\u4e09" != "\\u5f20\\u4e09",看下如下例子疼阔。

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

可見 "\u5f20\u4e09" 就是"張三"戒劫,而"\u5f20\u4e09"是一個(gè)顯示為"\u5f20\u4e09"的字符串。
unicode轉(zhuǎn)義-解碼
如何將"\u5f20\u4e09"轉(zhuǎn)為"張三"呢婆廊?方法如下
先按utf-8編碼回二進(jìn)制迅细,然后按unicode-escape方式解碼為正常文本

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

unicode轉(zhuǎn)義-編碼
如果想將"張三"轉(zhuǎn)為unicode轉(zhuǎn)義字符只需要反向操作即可。

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

GBK轉(zhuǎn)義

有些中文網(wǎng)頁中有時(shí)會使用GBK編碼淘邻,形式為\x開頭的字符如疯攒。

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

這個(gè)二進(jìn)制字符串b'\xd5\xc5\xc8\xfd'就是"張三",但如果我們拿到一個(gè)"\xd5\xc5\xc8\xfd"的普遍字符串呢?
操作方法如下列荔。

>>> name = "\xd5\xc5\xc8\xfd"
>>> name
'??èy'
>>> 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轉(zhuǎn)義

在有些情況下我們需要解碼html文檔中的轉(zhuǎn)義字符,或者進(jìn)行編碼贴浙,操作如下砂吞。

>>> import html
>>> args='{"e": 5, "f": 6}'
>>> html.escape(args)  # 轉(zhuǎn)義
'{"e": 5, "f": 6}'
>>> html.unescape('{"e": 5, "f": 6}')   # 轉(zhuǎn)回
'{"e": 5, "f": 6}'

url編碼

在url中需要對一些特殊字符進(jìn)行編碼,比如在瀏覽器地址欄中輸入https://httpbin.org/get?name=張三&age=12'
然后復(fù)制-粘貼崎溃,你會發(fā)現(xiàn)網(wǎng)址變?yōu)榱?code>https://httpbin.org/get?name=%E5%BC%A0%E4%B8%89&age=12蜻直,這就是url為確保ASCII對特殊字符集非ASCII編碼進(jìn)行的編碼。
如何解碼呢袁串?方法如下概而。

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

如果想要進(jìn)行urlencode編碼,則需要使用quote和urlencode囱修,quote對字符串進(jìn)行編碼赎瑰,一般只用于單個(gè)參數(shù)值,urlencode則對一組字典格式的參數(shù)進(jìn)行編碼組裝破镰。
示例如下:

>>> 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一般用于在接口中,將圖片或媒體變?yōu)橐环N固定長度的字符串形式孕似,方便傳輸踩娘。
base64編碼解碼方法如下。
編碼

>>> 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'
>>>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末喉祭,一起剝皮案震驚了整個(gè)濱河市养渴,隨后出現(xiàn)的幾起案子雷绢,更是在濱河造成了極大的恐慌,老刑警劉巖厚脉,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件习寸,死亡現(xiàn)場離奇詭異胶惰,居然都是意外死亡傻工,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門孵滞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來中捆,“玉大人,你說我怎么就攤上這事坊饶⌒刮保” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵匿级,是天一觀的道長蟋滴。 經(jīng)常有香客問我,道長痘绎,這世上最難降的妖魔是什么津函? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮孤页,結(jié)果婚禮上尔苦,老公的妹妹穿的比我還像新娘。我一直安慰自己行施,他們只是感情好允坚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蛾号,像睡著了一般稠项。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鲜结,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天皿渗,我揣著相機(jī)與錄音,去河邊找鬼轻腺。 笑死乐疆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贬养。 我是一名探鬼主播挤土,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼误算!你這毒婦竟也來了仰美?” 一聲冷哼從身側(cè)響起迷殿,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎咖杂,沒想到半個(gè)月后庆寺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诉字,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年懦尝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壤圃。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡陵霉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出伍绳,到底是詐尸還是另有隱情踊挠,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布冲杀,位于F島的核電站效床,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏权谁。R本人自食惡果不足惜剩檀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望闯传。 院中可真熱鬧谨朝,春花似錦、人聲如沸甥绿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽共缕。三九已至洗出,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間图谷,已是汗流浹背翩活。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留便贵,地道東北人菠镇。 一個(gè)月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像承璃,于是被迫代替她去往敵國和親利耍。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容