ASCII,Unicode,UTF-8和Base64

由於計算機只能處理數字,因此若是要處理文本,就得先把文本轉換成數字才能處理。編碼

ASCII

最先計算機在設計時採用8bit做爲一個字節(byte),因此一個字節能標識的最大整數就是255「11111111(B) = 255」,0-255被用來標識大小寫英文字母、數字和一些符號,這個編碼表就被稱爲ASCII編碼。加密

Unicode

若是要用來表示中文(漢字數量大約近10w個),顯然一個字節是不夠的,至少須要兩個字節。並且還不能和ASCII編碼表衝突,因此中國指定了GB2312編碼,用來編碼中文。 相似的,其餘語言也面臨這個問題,爲了統一全部文字的編碼,Unicode應運而生。設計

Unicode一般使用兩個字節來表示一個字符,全部的英文編碼從單字節變成了雙字節,把高字節所有填0補齊。3d

目前Unicode字符分爲17組編排,0x0000至0x10FFFF,每組稱爲平面(Plane),而沒平面擁有65535個碼位,共1114112個,然而目前只用了少數平面。code

UTF-8

UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode可變長度字符編碼。orm

UTF-8 與 Unicode區別

  • Unicode 是 「字符集」
  • UTF-8 是 「編碼規則」

字符集:爲每個字符分配一個惟一的ID(碼位/碼點/Code Point) 編碼規則:將碼位轉換爲字節序列的規則(編碼/解碼 => 加密/解密)cdn

UTF-8編碼規則

UTF-8是一種變長字節編碼方式。最小編碼單位(code unit)爲一個字節。一個字節的前1-3個bit爲描述性部分,後面爲實際序號部分。blog

  1. 對於單字節字符,佔用一個字節空間。0以後的全部部分(7個bit)表明Unicode中的序號。所以對於英文字母,UTF-8編碼和ASCII碼是相同的。
  2. 對於n字節字符,第一個字節的前n爲都爲1,第n+1爲0,後面字節的前兩位上爲10.剩下沒有說起的二進制位爲這個符號的unicode碼。
Unicode符號範圍「十六進制」 UTF-8編碼「二進制」
0000 0000-0000 007F 0xxxxxxxx
0000 0080-0000 07FF 110xxxxx 10xxxxxx
0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF 11110xxx 10xxxxxx 10xxxxxx

綜上:若是一個字節的第一位是0,則這個字節單獨就是一個字符;若是第一位是1,則連續有多少個1,就表示當前佔用多少個字節。unicode

舉例:字符串

禿的unicode爲79C3「0111 1001 1100 0011(B)」,根據上表處於 (0000 0080-0000 FFFF)範圍內,所以UTF-8須要三個字節,即格式爲1110xxxx 10xxxxxx 10xxxxxx,將unicode從最後一位往前依次填入格式x中,多出的補0。能夠得出UTF-8編碼爲11100111 10100111 10000011,轉爲十六進制爲E7A783。

Little endian & Big endian

以上面禿爲例,unicode碼爲79C3,須要兩個字節存儲,一個字節是79,另外一個字節是C3。存儲的方式79在前,C3在後,就是Big endian(大頭方式);C3在前,79在後就是Little endian(小透方式)

Base64

Base64是一種基於64個可打印的字符來標識二進制數據的標識方法。可打印的字符包括字母A-Z、a-z、數字0-9,這樣公有62個字符,此外兩個可打印的符號在不一樣系統中而不一樣。

在MIME格式的的電子郵件中,另外兩個符號爲加號+和斜槓/,等號=用來作後綴用途。

編碼轉換方式

  1. 將每三個字節做爲一組,一共24個二進制位。
  2. 將這24個二進制位分爲4組,每一個組有6個二進制位。
  3. 在每組前面加兩個00,擴展成32個二進制位,及四個字節。
  4. 而後根據下表獲得擴展後的每一個字節的編號,這就是Base64的編碼值。

-w961

綜上得出:

  • Base64字符標中的字符本來用6bit就能夠表示,如今前面添加2個0,變爲8bit,致使Base64編碼後的文本大小比原文大約三分之一
  • 爲何使用3個字節一組呢?由於6和8的最小公倍數是24,三個字節正好24個二進制位,每6bit一組,剛好可以分爲4組。

舉例以下:

  1. "Man"、"a"、"n"的ASCII值分別爲7七、9七、110,對應的二進制值爲0100110一、0110000一、01101110,將他們連成24位的二進制字符串010011010110000101101110。
  2. 將24位的二進制字符串分爲四組,即:0100十一、0101十、00010一、101110。
  3. 在每組前面加00,擴展成32個二進制位,即000100十一、000101十、0000010一、00101110。
  4. 根據上表,獲得Base64編碼爲T、W、F、u。

位數不足3位處理

  1. 二位的狀況:兩個字節工共16個二進制位,按照上面方式分組,每6個一組,則第三組缺乏2位,用0補齊。如"Ma"能夠轉換爲三組000100十一、000101十、00010000,對應的Base64值分別爲T、W、E,再補上一個"="號,所以"Ma"的Base64編碼爲"TWE="
  2. 一位的狀況:一字節工8個二進制位,按照上面方式分組,每6個一組,則第二組缺乏4位,用0補齊。如"M"能夠轉換爲000100十一、00010000,對應的Base64位的值分別爲:T、Q,再補上兩個"="號,所以"M"的Base64編碼就是TQ==

注意事項

  • 大多數編碼都是由字符串轉換爲二進制的過程,而Base64的編碼則是從二進制轉爲字符串。
  • Base64主要用在傳輸,存儲,表示二進制領域,不能算得上加密,只是沒法直接看到銘文。
  • 中文有不少編碼(好比:UTF-八、GB23十二、GBK等),不一樣的編碼對應的Base64編碼結果不同。
相關文章
相關標籤/搜索