幾個文字編碼小總結

2021-09-30 15:56:35 字數 4008 閱讀 2605

我們入門學習是最常用的一種編碼方式,因為1

位二進位制數可以表示2^n

種狀態:0

、1;而2

位二進位制數可以表示2^2=4

種狀態:00

、01、10

、11;依次類推,7

位二進位制數可以表示2^7=128

種狀態,每種狀態都唯一地編為乙個7

位的二進位製碼,對應乙個字元(或控制碼),這些碼可以排列成乙個十進位制序號0

~127

。所以,7

位ascii

碼是用七位二進位制數進行編碼的,可以表示128

個字元。

即乙個位元組表示乙個字元。

string teststring = "****你奶奶";

byte b = teststring.getbytes("ascii");

//轉化為乙個個位元組

for(int i=0;i

結果就是:

位元組為:102

位元組為:117

位元組為:99

位元組為:107

位元組為:63

位元組為:63

位元組為:63

轉化回來的是:****???

因為ascii碼,將「你奶奶」中文裡面的乙個字元也只看作乙個位元組。

包含了世界上的所有語言編碼,目前實際應用的unicode

版本對應於ucs-2

,使用16

位的編碼空間。也就是每個字元占用2

個位元組。這樣理論上一共最多可以表示216

即65536

個字元。基本滿足各種語言的使用。實際上目前版本的unicode

尚未填充滿這16

位編碼,保留了大量空間作為特殊使用或將來擴充套件。unicode

的實現方式稱為unicode轉換格式(unicode translation format

,簡稱為utf)。

即:unicode編碼的無論是英文、數字還是漢字,全部由2個字元表示。

string teststring = "****你奶奶";

byte b = teststring.getbytes("unicode");

//轉化為乙個個位元組

for(int i=0;i

輸出為:

位元組為:-2

位元組為:-1

位元組為:0

位元組為:102

位元組為:0

位元組為:117

位元組為:0

位元組為:99

位元組為:0

位元組為:107

位元組為:79

位元組為:96

位元組為:89

位元組為:118

位元組為:89

位元組為:118

但是我們會發現,轉化的時候之前的兩位多了乙個-2 -1

因為:如果乙個僅包含基本7

位ascii

字元的unicode

檔案,如果每個字元都使用2

位元組的原unicode

編碼傳輸,其第一位元組的8

位始終為0[7

位ascii

只佔乙個位元組的前7

位,高位致0]

。這就造成了比較大的浪費。對於這種情況,可以使用utf-8

編碼,這是一種變長編碼,它將基本7

位ascii

字元仍用7

位編碼表示,占用乙個位元組(首位補0

)。而遇到與其他unicode

字元混合的情況,將按一定演算法轉換,每個字元使用1-3

個位元組編碼,並利用首位為0

或1進行識別。這樣對以7

位ascii

字元為主的西文文件就大大節省了編碼長度。

utf-8

是unicode

的一種變長字元

編碼又稱萬國碼,如果unicode

字元由2

個位元組表示,則編碼成utf-8

很可能需要3

個位元組,而如果unicode

字元由4

個位元組表示,則編碼成utf-8

可能需要6

個位元組。用4

個或6個位元組去編碼乙個unicode

字元可能太多了,但很少會遇到那樣的unicode

字元。

string teststring = "****你奶奶";

byte b = teststring.getbytes("utf-8");

//轉化為乙個個位元組

for(int i=0;i

結果為:

位元組為:102

位元組為:117

位元組為:99

位元組為:107

位元組為:-28

位元組為:-67

位元組為:-96

位元組為:-27

位元組為:-91

位元組為:-74

位元組為:-27

位元組為:-91

位元組為:-74

即:我們可以看得出來,英文數字用兩個位元組表示,中文用三個位元組表示。

gbk編碼,是在gb2312-80

標準基礎上的內碼擴充套件規範,使用了雙位元組編碼方案,其編碼範圍從8140

至fefe

(剔除xx7f

),共23940

個碼位,共收錄了21003

個漢字,完全相容gb2312-80

標準,支援國際標準iso/iec10646-1

和國家標準gb13000-1

中的全部中日韓漢字,幷包含了big5

編碼中的所有漢字。

string teststring = "****你奶奶";

byte b = teststring.getbytes("gbk");

//轉化為乙個個位元組

for(int i=0;i

結果為:

位元組為:102

位元組為:117

位元組為:99

位元組為:107

位元組為:-60

位元組為:-29

位元組為:-60

位元組為:-52

位元組為:-60

位元組為:-52

即:一字元都是用兩個位元組表示

string teststring = "****你奶奶";

byte b = teststring.getbytes("gb2312");

//轉化為乙個個位元組

for(int i=0;i

結果為:

位元組為:102

位元組為:117

位元組為:99

位元組為:107

位元組為:-60

位元組為:-29

位元組為:-60

位元組為:-52

位元組為:-60

位元組為:-52

編碼規則類似gbk

iso/iec

8859-1

,又稱latin-1

或「西歐語言」

,是國際標準化組織

內iso/iec 8859

的第乙個8

位字符集

。它以ascii

為基礎,在空置的0xa0-0xff

的範圍內,加入192

個字母及符號,藉以供使用變音符號的拉丁字母語言使用。

string teststring = "****你奶奶";

byte b = teststring.getbytes("iso-8859-1");

//轉化為乙個個位元組

for(int i=0;i

結果為:

位元組為:102

位元組為:117

位元組為:99

位元組為:107

位元組為:63

位元組為:63

位元組為:63

即:所有的字元都用乙個位元組表示。

幾個dp的小總結

胖子很有錢。他購買了乙個先進的跑步機 真的不一樣哦 這個跑步機是這樣的 1.可以把它看成乙個n m的矩陣。有的格仔是障礙不能經過 用x表示 有的格仔是空地可以經過 用.表示 2.對於每乙個時段,跑步機有不同的傾斜方向。由於胖子太胖了,所以他這個時候只有2種選擇 要麼沿這個方向移動 每秒移動1個格仔 ...

MySQL編碼問題小總結

檢視資料庫編碼 這裡最好都設定為utf8編碼格式,在安裝mysql的時候有些版本是有這個資料庫編碼設定選項的,如果沒有,可以通過修改配置檔案 my.ini 然後重啟mysql。設定資料庫編碼 set character set client utf8 set character set connec...

文字編碼簡介

字元編碼概述 下表,按照固定長編碼和可變長編碼進行分類。gb2312和gbk如果從與ascii碼相容的角度來講,也可以認為是可變長編碼。對於ascii碼以外的文字都是2位元組編碼。ucs和unicode在1991年已經統一 ascii編碼 前32個字元 0x00 0x1f 為控制字元 33到126 ...