字符集其實很簡單
字符集其實是個很簡單的東西,但很多人當時看懂了,過了就忘了。
本篇文章的目的就是,不一定要把字符集的知識講的有多深,但是一定要在工作上夠用。
並且記得足夠牢足夠久。
工作中遇到的「辭彙」,主要是ASCII、GB2312、GBK、Unicode、UTF-8,還有URL Encode、URL Escape。
編碼和解碼
編碼,encode。
解碼,decode。
編碼,編成電腦能懂的碼,二進位。
解碼,解成人類能讀懂的碼,人語言。
想讓電腦懂,你得編它。
想讓人類能懂,你得解釋。
字元程式碼和字元編碼
字元程式碼就是序號,比如65。
字元編碼二進位序列,比如01000001。
由於基本相同,所以我們平時就忽略了差異。
差異體現在哪呢?UTF-8。
字符集發展歷史
美國,英文字母、標點符號字元、阿拉伯數字,ASCII。
歐洲,加入帶重音的字元、希臘字母等,Latin-1。
中國!加入漢字! GB2312 。
加入生僻字、繁體字及日韓漢字等,GBK。
各說各的,亂碼。
ISO國際標準化組織一統江湖,Unicode。
再編碼,UTF-8。
因為Unicode需要遵循統一的存儲,就造成了資源浪費,比如漢字和英文,佔用的空間是不一樣了。
為了支援這種差異,節約存儲,高效傳輸,對Unicode進行了再編碼,也就是UTF-8,也是用的最廣泛的字符集之一。
URL Encode和URL Escape
Web伺服器只允許URL中包含ASCII。
那怎麼辦?只有先encode成二進位,讓伺服器自己decode咯。
所以URL Encode後是「百分號+2位十六進位」的形式,比如%20。
需要Encode的包括
- 非ASCII字元
- ASCII控制字元,因為不可列印
- 保留字元,如&,因為URL自身是用&分隔的,參數內容包括&的話就要Encode
- 不安全字元,如空格,可能造成歧義
用Python來實際看看
from urllib.parse import urlencode
x = urlencode({"a": 1, "b": "a", "c": "漢", "d": " ", "e": "&"})
print(x) # a=1&b=a&c=%E6%B1%89&d=+&e=%26
URL Escape,也就是URL轉義,碰到最多的就是把<
、>
、&
轉成<
、>
、&
。
Python html.escape函數,一切盡在程式碼中
def escape(s, quote=True):
"""
Replace special characters "&", "<" and ">" to HTML-safe sequences.
If the optional flag quote is true (the default), the quotation mark
characters, both double quote (") and single quote (') characters are also
translated.
"""
s = s.replace("&", "&") # Must be done first!
s = s.replace("<", "<")
s = s.replace(">", ">")
if quote:
s = s.replace('"', """)
s = s.replace('\'', "'")
return s
有時候還會碰到被轉成了\u003e
、\u003c
、\u0026
,這是JSON序列化搞出來的Unicode。
回顧
本文首先講了怎麼記憶編碼和解碼,然後通過字元程式碼和字元編碼的差異,引出了如今常用的UTF-8,接著從發展歷史來看,字符集是怎麼發展到現在的。
最後解釋了Web URL中容易混淆的2個概念,URL Encode和URL Escape。
當然,如果過了不久還是忘了,那麼只有把這篇文章翻出來再看一遍了(手動滑稽)。
版權申明:本文為部落客原創文章,轉載請保留原文鏈接及作者。
如果您喜歡我寫的文章,請關注公眾號支援一下,謝謝哈哈哈。
