ASCII unicode utf8 編碼、解碼的那些事

ASCII unicode gbk utf8 編碼、解碼的那些事

對應編碼這塊一直處於一種懵懵懂懂的狀態,有的時候去查了資料,當下理解了,過一段時間又遺忘了,今天又重新查閱了一番資料,記錄一下所感所悟。

阮一峯老師 關於編碼的總結

1.ASCII碼

  • ASCII(American Standard Code for Information Interchange)

計算機內部所有信息都是用二進制來存儲的,一個二進制位有0或1兩種狀態,8個二進制位稱爲一個字節,一個字節就有256種狀態。

上個世紀60年代,美國製定了一套字符編碼,對英語字符與二進制位之間的關係,做了統一規定。這被稱爲 ASCII 碼,一直沿用至今。
ASCII 碼一共規定了128個字符的編碼,比如空格SPACE是32(二進制00100000),大寫的字母A是65(二進制01000001)。這128個符號(包括32個不能打印出來的控制符號),只佔用了一個字節的後面7位,最前面的一位統一規定爲0。

128個字符可以滿足英語母語國家的基本需求,但對於歐洲的其他國家,由於自己母語的特殊性,仍需要其他字符才能儘可能的表示所有語言字符。所以他們擴展了原有的ASCII碼,把一個字節最高位爲1的狀態也用來表示字符,便有256種狀態。基本上 0-127 仍遵循ASCII碼,不同的國家在128-256狀態碼的表示內容上有所區別。

至於亞洲國家的文字,使用的符號就更多了,漢字就多達10萬左右。一個字節只能表示256種符號,肯定是不夠的,就必須使用多個字節表達一個符號。比如,簡體中文常見的編碼方式是 GB2312,使用兩個字節表示一個漢字,所以理論上最多可以表示 256 x 256 = 65536 個符號。

2.unicode

之前也提到了,ASCII不能解決所有國家的編碼問題,所以不同的國家針對性的有了不同的編碼方式(密文),那麼能不能有這麼一種符號集 ,他可以包含所有國家的所有語言信息,全球範圍內的通用。unicode 應用而生,全球範圍內的字符集。

3.utf8

unicode 只是創造了這麼一個字符集,並沒有考慮如何去存儲的問題,沒有考慮一個字符用多少字節表示等。
utf8、utf16等,便是unicode的實現方式。utf8,規定一個字符用1-4個字節表示
關於如何確定用幾個字節表示:
單字節表示:字節最高位爲0 ,ascii碼 保持不變
多字節表示:n個字節 首字節前n位都爲1,第n+1位爲0,其餘字節首位爲10,(即我們可以通過首字節從頭開始,1的連續個數判斷 該字符由多少字節表示)
以漢字嚴爲例,演示如何實現 UTF-8 編碼。

嚴的 Unicode 是4E25(100111000100101),根據上表,可以發現4E25處在第三行的範圍內(0000 0800 - 0000 FFFF),因此嚴的 UTF-8 編碼需要三個字節,即格式是1110xxxx 10xxxxxx 10xxxxxx。然後,從嚴的最後一個二進制位開始,依次從後向前填入格式中的x,多出的位補0。這樣就得到了,嚴的 UTF-8 編碼是11100100 10111000 10100101,轉換成十六進制就是E4B8A5

4.encode 與 decode

之前理解的encode 與 decode,便是簡單意義的 編碼 str -> b,
解碼 b -> str

不同的編碼方式下的內容不可以直接轉化,比如 有一條非常重要的消息需要傳達,爲了防止被竊取,通過密鑰1加密了一份,密鑰2加密了一份。同樣的內容,不同的加密方式,我們只能拿着密鑰1 解密 通過密鑰1加密的消息,而不可以用密鑰1解密 通過密鑰2加密的消息。編碼之間亦是如此。

unicode 便是不同編碼之間轉化的一箇中間人,中轉站。得到一份內容,例如是 gbk加密的消息,我們需要先解碼成unicode (str2 = str.decode(‘gbk’)),再加密成utf8(str3 = str2.encode(‘utf8’)) 進行傳輸

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章