淺談編碼Base6四、Hex、UTF-八、Unicode、GBK等

  網絡上大多精彩的回答,該隨筆用做自我總結;linux

  首先計算機只認得二進制,0和1,因此咱們如今看到的字都是通過二進制數據編碼後的;計算機能針對0和1的組合作不少事情,這些規則都是人定義的;而後有了字節的概念,8比特一個字節,如01011100就是一個字節;網絡

  人定義好計算機的0和1的數據結構作事的時候,若是每一個人都用不一樣的數據結構,不一樣的定義,就會使得人和人之間讓計算機作的事沒法統一,也致使沒法通信,因此要一塊兒共同定義一套你們都認同的規則,其中ASCii碼就是最初始的交換碼,用作記錄信息、交互信息的;數據結構

  相同的字節串不一樣的編碼就會有不一樣的展現,只有正確的編碼才能表達出字符串自己要記載的信息,而信息是面向人的,只有人能識別,才叫信息,只是偶爾被計算機理解;工具

字節、字符與字符串:編碼

  字節是8比特位構成,上傳已經說了;spa

  字符是用字節構成的,但多少字節,怎麼構成咱們認識的惟一的字符?這個由編碼格式決定,也就是Unicode、GBK,(爲啥要用字節?,由於歷史以爲8比特很牛逼啊)操作系統

  字符串是字符的序列,各類計算機語言不一樣表示,如Redis就和C的字符串不同,C是以 ‘\0’ 結尾;咱們說的對字符的編碼,而不是字符串;code

Hex用字符串形式看二進制代碼:ip

  首先,二進制文件一般不易於人看,由於人會看眼花,因此必須轉爲其餘進制,16進制是最好的,恰好2字符表示一個字節unicode

  Hex編碼是以4比特做爲一個單位編碼,用4是由於計算機進位是2的倍數,而爲了能把比特串分割開來,最適中就是取16進制;因此Hex編碼就是16進制編碼;用於人類比用比特更直觀簡介的方式看待比特串(立刻反應過來比特串),固然取更多位不適合人口算;

  而後咱們就有了WinHex這個工具的命名;用它修復二進制文件很不錯,前提你對該文件二進制構表(通常是具備協議去解析二進制的,我稱之爲構表協議吧)很熟;

  Base64是面向網絡的,其實性質也是這樣;

Unicode、GBK都是字符串編碼:

  看到知乎一個alipay的說啥編碼和編碼格式不一樣,gbk是unicode的編碼格式,簡直笑死人;

  重複一遍,字符是獨一無二的,人類符號系統抽象的產物,世界惟一,全世界的字符構成字符集,字符也是在演進的;而Unicode和GBK等都是字符的一種編碼;也就是一個二進制比特串(數字)和字符的映射表;

Java內部是Unicode默認,以及其面向字符、面向字節

  對於一個抽象字符,在Java中的二進制表示固然須要編碼,用的就是Unicode,若是源文件存儲並不是Unicode怎麼辦呢?固然須要轉換,所以Java不少面向字符流的I/O其實都是默認有轉換規則存在;

  這裏提下I/O都分面向字節和字符,其實面向字節就是無論編碼,而面向字符是帶編碼轉換,是的一個抽象字符串如 「飯」 是在哪一種編碼格式都表示 「飯」,所以面向字符I/O指定編碼格式很重要,通常不指定採用默認,如win操做系統默認GBK,而linux默認UTF-8;

UTF-8和Unicode是哈夫曼編碼:

  本身去查一下吧,是哈夫曼編碼轉換的

    Unicode

  UTF-8

  0000 - 007F

  0xxxxxxx

  0080 - 07FF

  110xxxxx 10xxxxxx

  0800 - FFFF

  1110xxxx 10xxxxxx 10xxxxx

 

 

  待續

相關文章
相關標籤/搜索