淺談編碼Base64、Hex、UTF-8、Unicode、GBK等

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

  首先計算機只認得二進制,0和1,所以我們現在看到的字都是經過二進制數據編碼後的;計算機能針對0和1的組合做很多事情,這些規則都是人定義的;然後有了字節的概念,8比特一個字節,如01011100就是一個字節;

  人定義好計算機的0和1的數據結構做事的時候,如果每個人都用不同的數據結構,不同的定義,就會使得人和人之間讓計算機做的事無法統一,也導致無法通訊,所以要一起共同定義一套大家都認同的規則,其中ASCii碼就是最初始的交換碼,用做記錄信息、交互信息的;

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

字節、字符與字符串:

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

  字符是用字節構成的,但多少字節,怎麼構成我們認識的唯一的字符?這個由編碼格式決定,也就是Unicode、GBK,(爲啥要用字節?,因爲歷史覺得8比特很牛逼啊)

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

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

  首先,二進制文件通常不易於人看,因爲人會看眼花,所以必須轉爲其他進制,16進制是最好的,剛好2字符表示一個字節

  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

 

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