Linux課題實踐三——字符集總結與分析服務器
20135318 劉浩晨ide
字符是各類文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數字等。字符集是多個字符的集合,字符集種類較多,每一個字符集包含的字符個數不一樣,常見字符集名稱:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。函數
1.總結ISO、UCS/UTF、GB系列字符集的由來、異同編碼
(1)、ISO/IECspa
ISO/IEC 646:是國際標準化組織(ISO)及國際電工委員會(IEC)聯合制定的一系列7位字符集的標準來自數個國家標準,最主要來自美國的 ASCII(美國信息互換標準代碼)。ISO 646 除了英語字母和數字部分,爲全部國家相同外,有些使用字母的國家,可按照實際須要,把ISO 646修改,以定出該國的字符標準。翻譯
ISO/IEC 8859:是國際標準化組織(ISO)及國際電工委員會(IEC)聯合制定的一系列8位字符集的標準,現時定義了15個字符集。ASCII收錄了空格及94個「可印刷字符」,足以給英語使用。可是,其餘使用拉丁字母的語言(主要是歐洲國家的語言),都有必定數量的附加符號字母,故可使用ASCII及控制字符之外的區域來儲存及表示。code
(2)、UCS/UTF:orm
Unicode:Unicode(萬國碼)對世界上大部分的文字系統進行了整理、編碼,使得電腦能夠用更爲簡單的方式來呈現和處理文字。Unicode涵蓋的數據除了視覺上的字形、編碼方法、標準的字符編碼外,還包含了字符特性,如大小寫字母。blog
Unicode編碼方式:統一碼的編碼方式與ISO 10646的通用字符集概念相對應。目前實際應用的統一碼版本對應於UCS-2,使用16位的編碼空間。也就是每一個字符佔用2個字節。這樣理論上一共最多能夠表示216(即65536)個字符。排序
UTF:Unicode的實現方式,也稱爲Unicode轉換格式(Unicode Transformation Format),包括UTF-八、UTF-七、Punycode、CESU-八、SCSU、UTF-3二、GB18030等。
UTF-8:是一種針對Unicode的可變長度字符編碼,也是一種前綴碼。它能夠用來表示Unicode標準中的任何字符,且其編碼中的第一個字節仍與ASCII兼容,這使得原來處理ASCII字符的軟件無須或只須作少部份修改,便可繼續使用。
UTF-8使用一至六個字節爲每一個字符編碼:
①128個US-ASCII字符只需一個字節編碼(Unicode範圍由U+0000至U+007F)。
②帶有附加符號的拉丁文、希臘文、西裏爾字母、亞美尼亞語、希伯來文、阿拉伯文、敘利亞文及它拿字母則須要兩個字節編碼(Unicode範圍由U+0080至U+07FF)。
③其餘基本多文種平面(BMP)中的字符(這包含了大部分經常使用字,如大部分的漢字)使用三個字節編碼(Unicode範圍由U+0800至U+FFFF)。
④其餘極少使用的Unicode 輔助平面的字符使用四至六字節編碼
UCS:通用字符集(Universal Character Set),是由ISO制定的ISO 10646(或稱ISO/IEC 10646)標準所定義的標準字符集。
通用字符集包括了其餘全部字符集。它保證了與其餘字符集的雙向兼容,即,若是你將任何文本字符串翻譯到UCS格式,而後再翻譯回原編碼,你不會丟失任何信息。
UCS包含了已知語言的全部字符。除了拉丁語、希臘語、斯拉夫語、希伯來語、阿拉伯語、亞美尼亞語、格魯吉亞語,還包括中文、日文、韓文這樣的方塊文字,UCS還包括大量的圖形、印刷、數學、科學符號。
UCS不只給每一個字符分配一個代碼,並且賦予了一個正式的名字。表示一個UCS或Unicode值的十六進制數一般在前面加上「U+」,例如「U+0041」表明字符「A」。
(3)、Unicode和ISO 10646的關係:
歷史上存在兩個獨立的嘗試創立單一字符集的組織,即國際標準化組織(ISO)於1984年建立的ISO/IEC和由Xerox、Apple等軟件製造商於1988年組成的統一碼聯盟。
1991年先後,兩個項目的參與者都認識到,世界不須要兩個不兼容的字符集。因而,它們開始合併雙方的工做成果,併爲創立一個單一編碼表而協同工做。從Unicode 2.0開始,Unicode採用了與ISO 10646-1相同的字庫和字碼;ISO也承諾,ISO 10646將不會替超出U+10FFFF的UCS-4編碼賦值,以使得二者保持一致。
(4)、GB:
GB 2312 或 GB 2312-80 :是中華人民共和國國家標準簡體中文字符集,全稱《信息交換用漢字編碼字符集•基本集》,又稱GB0,由中國國家標準總局發佈,1981年5月1日實施。GB2312編碼通行於中國大陸;新加坡等地也採用此編碼。中國大陸幾乎全部的中文系統和國際化的軟件都支持GB 2312。
GB 2312標準共收錄6763個漢字,其中一級漢字3755個,二級漢字3008個;同時收錄了包括拉丁字母、希臘字母、日文平假名及片假名字母、俄語西裏爾字母在內的682個字符。
GB 2312中對所收漢字進行了「分區」處理,每區含有94個漢字/符號。這種表示方式也稱爲區位碼。
GB 2312的區位碼:
01-09區爲特殊符號。
16-55區爲一級漢字,按拼音排序。
56-87區爲二級漢字,按部首/筆畫排序。
10-15區及88-94區則未有編碼。
舉例來講,「啊」字是GB2312之中的第一個漢字,它的區位碼就是1601。
2.會設置修改系統、應用默認字符集
a、查看服務器字符集
locale命令查看當前服務器字符集:
可見,虛擬機使用的字符集是zh_CN.UTF-8
(1) 查看服務器支持的字符集 #locale –a:
(2) 修改字符集類型
LANG=xxx 或者 export LANG=xxx;
注:xxx爲欲修改成的字符集,可選擇en_US.UTF-8。
取消字符集還能夠執行unset LANG這個命令。
(3) 查看某個文件的字符類型
3.同一文件存儲爲不一樣字符集,並分析原始數據
(1)Unicode——UTF-8
首先,在Unicode編碼表和GB2312編碼表中查詢「劉浩晨」的編碼,查詢結果以下:
Unicode編碼表:「劉」—「5218」、「浩」—「6d69」、「晨」—「6668」
GB2312編碼表:「劉」—「C1F5」、「浩」—「BAC6」、「晨」—「B3BF」
UTF-8文件的前3個byte是:EF BB BF。以後的編碼按照大端方式排列,漢字實用的是utf-8格式:E5 88 98 E6 B5 A9 E6 99 A8;而數字20135218(32 30 31 33 35 32 33 38)和字母(6C 68 63)也是ASCII碼。
(2)Unicode——ANSI(GB2312——Unicode)
ANSI編碼方式實際上就是GB2312編碼方式,Windows函數MultiByteToWideChar用於將多字節字符串轉換成寬字符串;函數WideCharToMultiByte將寬字符串轉換成等價的多字節字符串(Unicode屬於寬字節字符集,ANSI屬於多字節字符集)。
漢字部分爲C1F5 BAC6 B3BF就是「劉浩晨」的gb3212編碼,而阿拉伯數字20135218(32 30 31 33 35 32 33 38)和英文字母lhc(6C 68 63)都是用ASCII編碼表示,大端方式編碼。0D 0A表示回車換行。
(3)Unicode——Unicode big endian
這兩種編碼方式其實沒有本質區別,Unicode是以 「FF FE」 開頭, 每個字符佔2個字節, 低8位爲字符二進制編碼, 高8位爲0,漢字也佔2個字節;而Unicode big endian以「FE FF」開頭, 每個字符佔2個字節,與Unicode順序相反, 低8位爲字符二進制編碼, 高8位爲0 ;漢字也佔2個字節。總而言之,就是它們的開頭數據不一樣,另外,Unicode採用的是小端方式(存儲與讀取順序相反),Unicode big endian採用的是大端方式(存儲與讀取順序相同),因此兩者之間只是變一下位置而已,很容易進行轉化。
Unicode big endian:
Unicode: