我們入門學習是最常用的一種編碼方式,因為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 ...