工作中經常遇到中文亂碼的問題,由於歷史的原因,工作中經常遇到檔案編碼不一致的情況。老員工之前使用的是gbk編碼,新來的拿到之前的**,用utf8編碼開啟,就會出現亂碼,我就經常遇到這樣的情況。不同系統間傳遞檔案也會出現亂碼的情況,比如蘋果系統開啟windows系統的檔案,也會有亂碼。今天來學習一下計算機字元編碼的相關知識。
基本的ascii碼有128個字元,包括96個可列印字元和32個控制字元。使用7個二進位制位對字元進行編碼,對應的iso標準為iso646標準。a的ascii碼為65,0為48,a為97等。由於計算機基本處理單位是位元組(8個二進位制位),所以用乙個位元組來儲存ascii碼,最高位通常為0。
擴充套件ascii碼與標準ascii碼保持相容,擴充了(128~255)128個字元。一共可以表示256個字元。
無論是ascii碼還是擴充套件ascii碼,都無法對上萬個的漢子進行編碼。
gb2312是2023年發布的,標準號為gb2312-1980,也被稱為國標碼。幾乎所有的中文系統和國際化的軟體都支援該編碼。由6763個漢子和682個全形的字元組成。其中一級漢子3755個,二級漢子3008個。gb2312採用二維矩陣法對所有字元進行編碼,矩陣大小為94 x 94,可以表示8836種情況,每一行為區,每一列為位,區位確定了唯一的位置,稱為字元的區位碼。區位分別用乙個位元組表示,所以中文字元需要占用兩個位元組。為了區分是中文編碼還是西文字元,需要每個位元組分別加上160的方法轉換為儲存碼,計算機儲存的是此編碼的補碼,位碼在前,區碼在後。
gb2312編碼用兩個位元組表示乙個漢字,理論上可以表示65536個漢字。
但上面說到gb2312採用94 x 94的矩陣,表示7000多個字元。
gbk編碼標準相容gb2312,共收錄漢字21003多個,符號883個。gbk的出現彌補了gb2312的不足。gbk採用雙位元組表示,首位元組在81-fe之間,尾位元組在40-fe之間,去除xx7f一條線。蘋果os以gb2312為基本漢字編碼,windows以gbk為基本漢字編碼。
也稱大五碼,是一種正體中文漢字字符集編碼,與gb2312編碼範圍存在衝突,不能同時支援兩種字符集的字元。big5編碼成為正體中文編碼的事實標準,在台灣,香港,澳門以及其他海外華人中普遍使用。
不同的國家和地區制定了不同的標準,由此產生了gb2312,gbk,big5,等各自的編碼標準,這些用1至4個位元組來表示乙個字元的各種漢字延伸編碼方式稱為ansi編碼,在簡體中文windows作業系統中,ansi 編碼代表 gbk 編碼;在日文windows作業系統中,ansi 編碼代表 shift_jis 編碼。不同 ansi 編碼之間互不相容,當資訊在國際間交流時,無法將屬於兩種語言的文字,儲存在同一段 ansi 編碼的文字中。 當然對於ansi編碼而言,0x00~0x7f之間的字元,依舊是1個位元組代表1個字元。這一點是ansi編碼與unicode編碼之間最大也最明顯的區別。
如上ansi編碼條例中所述,世界上存在著多種編碼方式,在ansi編碼下,同乙個編碼值,在不同的編碼體系裡代表著不同的字。在ansi編碼體系下,要想開啟乙個文字檔案,不但要知道它的編碼方式,還要安裝有對應編碼表,否則就可能無法讀取或出現亂碼。為什麼電子郵件和網頁都經常會出現亂碼,就是因為資訊的提供者可能是日文的ansi編碼體系和資訊的讀取者可能是中文的編碼體系,他們對同乙個二進位制編碼值進行顯示,採用了不同的編碼,導致亂碼。這個問題促使了unicode碼的誕生。
如果有一種編碼,將世界上所有的符號都納入其中,無論是英文、日文、還是中文等,大家都使用這個編碼表,就不會出現編碼不匹配現象。每個符號對應乙個唯一的編碼,亂碼問題就不存在了。這就是unicode編碼。
utf-8(8-bit unicode transformation format)是一種針對unicode的可變長度字元編碼,又稱萬國碼,由ken thompson於2023年建立。現在已經標準化為rfc 3629。utf-8用1到6個位元組編碼unicode字元。用在網頁上可以統一頁面顯示中文簡體繁體及其它語言。
如果unicode字元由2個位元組表示,則編碼成utf-8很可能需要3個位元組。而如果unicode字元由4個位元組表示,則編碼成utf-8可能需要6個位元組。用4個或6個位元組去編碼乙個unicode字元可能太多了,但很少會遇到那樣的unicode字元。utf-8編碼規則:如果只有乙個位元組則其最高二進位制位為0;如果是多位元組,其第乙個位元組從最高位開始,連續的二進位制位值為1的個數決定了其編碼的位元組數,其餘各位元組均以10開頭。
base64是網路上最常見的用於傳輸8bit位元組碼的編碼方式之一,base64就是一種基於64個可列印字元來表示二進位制資料的方法。
轉碼過程例子:
3
*8=4
*6記憶體1個位元組佔8位
轉前: s13
先轉成ascii:對應 115
4951
2進製: 01110011
00110001
00110011
6個一組(4組) 011100110011000100110011
然後才有後面的 011100
110011
000100
110011
然後計算機是8位8位的存數 6不夠,自動就補兩個高位0了
所有有了 高位補0
科學計算器輸入 00011100
00110011
00000100
00110011
得到 28514
51查對下照表 c z e z
大端模式,是指資料的高位元組儲存在記憶體的低位址中,而資料的低位元組儲存在記憶體的高位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理:位址由小向大增加,而資料從高位往低位放;這和我們的閱讀習慣一致。
小端模式,是指資料的高位元組儲存在記憶體的高位址中,而資料的低位元組儲存在記憶體的低位址中,這種儲存模式將位址的高低和資料位權有效地結合起來,高位址部分權值高,低位址部分權值低。
字元編碼相關知識總結
1.什麼是字元 字元是書寫的最基本構建單元。字元可以表示字母 數字 標點 表意符號 比如漢字 數學符號,或者其他的書寫基本單元。不能把字元和字形相混淆。字元是唯一的,抽象的語言 原子 字形是畫出每個符號時使用的特定方式。只有當用一種字形替代另一種字形,文字的意思發生了改變,才把這些字形看成是不同的字...
基礎知識總結 字元編碼
因為資料是二進位制表示的,現在存在各種各樣的編碼,因為計算機識別的編碼與資料本身的編碼不一致,就會造成亂碼。ascii 美國規定的128個字元表示的二進位制表示方法,這種方法稱為ascii碼,計算機儲存的最小單位是位元組 8位 ascii碼的後7位表示字元本身,最高位設定為0,後7位0 127表示1...
字元編碼總結
各種編碼的檔案頭 ff fe unicode fe ff unicode big endian ef bb bf utf 8 unicode也是一種字元編碼方法,不過它是由國際組織設計,可以容納全世界所有語言文字的編碼方案。unicode的學名是 universal multiple octet c...