字符集其實很簡單

字符集其實是個很簡單的東西,但很多人當時看懂了,過了就忘了。

本篇文章的目的就是,不一定要把字符集的知識講的有多深,但是一定要在工作上夠用。

並且記得足夠牢足夠久。

工作中遇到的「辭彙」,主要是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轉義,碰到最多的就是把<>&轉成&lt;&gt;&amp;

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("&", "&amp;") # Must be done first!
    s = s.replace("<", "&lt;")
    s = s.replace(">", "&gt;")
    if quote:
        s = s.replace('"', "&quot;")
        s = s.replace('\'', "&#x27;")
    return s

有時候還會碰到被轉成了\u003e\u003c\u0026,這是JSON序列化搞出來的Unicode。

回顧

本文首先講了怎麼記憶編碼和解碼,然後通過字元程式碼和字元編碼的差異,引出了如今常用的UTF-8,接著從發展歷史來看,字符集是怎麼發展到現在的。

最後解釋了Web URL中容易混淆的2個概念,URL Encode和URL Escape。

當然,如果過了不久還是忘了,那麼只有把這篇文章翻出來再看一遍了(手動滑稽)。

版權申明:本文為部落客原創文章,轉載請保留原文鏈接及作者。
如果您喜歡我寫的文章,請關注公眾號支援一下,謝謝哈哈哈。



Tags: