字符集與字符編碼的那些事

字符集與字符編碼

什麼是字符集?字符集有哪些?
字符(Character)是各種文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數字等。字符集(Character set)是多個字符的集合,字符集種類較多,每個字符集包含的字符個數不同,常見字符集名稱:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。計算機要準確的處理各種字符集文字,需要進行字符編碼,以便計算機能夠識別和存儲各種文字。中文文字數目大,而且還分爲簡體中文和繁體中文兩種不同書寫規則的文字,而計算機最初是按英語單字節字符設計的,因此,對中文字符進行編碼,是中文信息交流的技術基礎。

ASCII名稱由來

ASCII(American Standard Code for Information Interchange,美國信息互換標準編碼)是基於羅馬字母表的一套電腦編碼系統。[1]
特點

它主要用於顯示現代英語和其他西歐語言。它是現今最通用的單字節編碼系統,並等同於國際標準ISO 646。
包含內容

控制字符:回車鍵、退格、換行鍵等。
可顯示字符:英文大小寫字符、阿拉伯數字和西文符號。
技術特徵

7位(bits)表示一個字符,共128字符,字符值從0到127,其中32到126是可打印字符。
擴展字符集

7位編碼的字符集只能支持128個字符,爲了表示更多的歐洲常用字符對ASCII進行了擴展,ASCII擴展字符集使用8位(bits)表示一個字符,共256字符。
ASCII擴展字符集:它是從ASCII字符集擴充出來的,擴充後的符號增加了表格符號、計算符號、希臘字母和特殊的拉丁符號。
GB2312名稱由來

GB2312又稱爲GB2312-80字符集,全稱爲《信息交換用漢字編碼字符集·基本集》,由原中國國家標準總局發佈,1981年5月1日實施。
特點

GB2312是中國國家標準的簡體中文字符集。它所收錄的漢字已經覆蓋99.75%的使用頻率,基本滿足了漢字的計算機處理需要。在中國大陸和新加坡獲廣泛使用。
包含內容

GB2312收錄簡化漢字及一般符號、序號、數字、拉丁字母、日文假名、希臘字母、俄文字母、漢語拼音符號、漢語注音字母,共 7445 個圖形字符。其中包括6763個漢字,其中一級漢字3755個,二級漢字3008個;包括拉丁字母、希臘字母、日文平假名及片假名字母、俄語西裏爾字母在內的682個全角字符。
技術特徵

(1)分區表示:
GB2312中對所收漢字進行了“分區”處理,每區含有94個漢字/符號。這種表示方式也稱爲區位碼。
各區包含的字符如下:01-09區爲特殊符號;16-55區爲一級漢字,按拼音排序;56-87區爲二級漢字,按部首/筆畫排序;10-15區及88-94區則未有編碼。
(2)雙字節表示
兩個字節中前面的字節爲第一字節,後面的字節爲第二字節。習慣上稱第一字節爲“高字節” ,而稱第二字節爲“低字節”。
“高位字節”使用了0xA1-0xF7(把01-87區的區號加上0xA0),“低位字節”使用了0xA1-0xFE(把01-94加上0xA0)。
編碼舉例

以GB2312字符集的第一個漢字“啊”字爲例,它的區號16,位號01,則區位碼是1601,在大多數計算機程序中,高字節和低字節分別加0xA0得到程序的漢字處理編碼0xB0A1。計算公式是:0xB0=0xA0+16, 0xA1=0xA0+1。
BIG5名稱由來

又稱大五碼或五大碼,1984年由臺灣財團法人信息工業策進會和五家軟件公司宏碁 (Acer)、神通 (MiTAC)、佳佳、零壹 (Zero One)、大衆 (FIC)創立,故稱大五碼。
Big5碼的產生,是因爲當時臺灣不同廠商各自推出不同的編碼,如倚天碼、IBM PS55、王安碼等,彼此不能兼容;另一方面,臺灣政府當時尚未推出官方的漢字編碼,而中國大陸的GB2312編碼亦未有收錄繁體中文字。
特點

Big5字符集共收錄13,053箇中文字,該字符集在中國臺灣使用。耐人尋味的是該字符集重複地收錄了兩個相同的字:“兀”(0xA461及0xC94A)、“嗀”(0xDCD1及0xDDFC)。
編碼方法

Big5碼使用了雙字節儲存方法,以兩個字節來編碼一個字。第一個字節稱爲“高位字節”,第二個字節稱爲“低位字節”。高位字節的編碼範圍0xA1-0xF9,低位字節的編碼範圍0x40-0x7E及0xA1-0xFE。
各編碼範圍對應的字符類型如下:0xA140-0xA3BF爲標點符號、希臘字母及特殊符號,另外於0xA259-0xA261,存放了雙音節度量衡單位用字:兙兛兞兝兡兣嗧瓩糎;0xA440-0xC67E爲常用漢字,先按筆劃再按部首排序;0xC940-0xF9D5爲次常用漢字,亦是先按筆劃再按部首排序。
侷限性

儘管Big5碼內包含一萬多個字符,但是沒有考慮社會上流通的人名、地名用字、方言用字、化學及生物科等用字,沒有包含日文平假名及片假名字母。
例如臺灣視“着”爲“著”的異體字,故沒有收錄“着”字。康熙字典中的一些部首用字(如“亠”、“疒”、“辵”、“癶”等)、常見的人名用字(如“堃”、“煊”、“栢”、“喆”等) 也沒有收錄到Big5之中。
GB18030名稱由來

GB 18030的全稱是GB18030-2000《信息交換用漢字編碼字符集基本集的擴充》,是我國政府於2000年3月17日發佈的新的漢字編碼國家標準,2001年8月31日後在中國市場上發佈的軟件必須符合本標準。
特點

GB 18030字符集標準的出臺經過廣泛參與和論證,
GB18030 字符集
GB18030 字符集
來自國內外知名信息技術行業的公司,信息產業部和原國家質量技術監督局聯合實施。
GB 18030字符集標準解決漢字、日文假名、朝鮮語和中國少數民族文字組成的大字符集計算機編碼問題。該標準的字符總編碼空間超過150萬個編碼位,收錄了27484個漢字,覆蓋中文、日文、朝鮮語和中國少數民族文字。滿足中國大陸、香港、臺灣、日本和韓國等東亞地區信息交換多文種、大字量、多用途、統一編碼格式的要求。並且與Unicode 3.0版本兼容,填補Unicode擴展字符字彙“統一漢字擴展A”的內容。並且與以前的國家字符編碼標準(GB2312,GB13000.1)兼容。
編碼方法

GB 18030標準採用單字節、雙字節和四字節三種方式對字符編碼。單字節部分使用0×00至0×7F碼(對應於ASCII碼的相應碼)。雙字節部分,首字節碼從0×81至0×FE,尾字節碼位分別是0×40至0×7E和0×80至0×FE。四字節部分採用GB/T 11383未採用的0×30到0×39作爲對雙字節編碼擴充的後綴,這樣擴充的四字節編碼,其範圍爲0×81308130到0×FE39FE39。其中第一、三個字節編碼碼位均爲0×81至0×FE,第二、四個字節編碼碼位均爲0×30至0×39。
包含內容

雙字節部分收錄內容主要包括GB13000.1全部CJK漢字20902個、有關標點符號、表意文字描述符13個、增補的漢字和部首/構件80個、雙字節編碼的歐元符號等。 四字節部分收錄了上述雙字節字符之外的,包括CJK統一漢字擴充A在內的GB 13000.1中的全部字符。
Unicode名稱由來

Unicode字符集編碼是Universal Multiple-Octet Coded Character Set 通用多八位編碼字符集的簡稱,是由一個名爲 Unicode 學術學會(Unicode Consortium)的機構制訂的字符編碼系統,支持現今世界各種不同語言的書面文本的交換、處理及顯示。該編碼於1990年開始研發,1994年正式公佈,最新版本是2012年1月31日的Unicode 6.1。
特徵

Unicode是一種在計算機上使用的字符編碼。它爲每種語言中的每個字符設定了統一併且唯一的二進制編碼,以滿足跨語言、跨平臺進行文本轉換、處理的要求。
編碼方法

Unicode 標準始終使用十六進制數字,而且在書寫時在前面加上前綴“U+”,例如字母“A”的編碼爲 004116 和字符“?”的編碼爲 20AC16。所以“A”的編碼書寫爲“U+0041”。
UTF-8 編碼

UTF-8是Unicode的其中一個使用方式。 UTF是 Unicode Tranformation Format,即把Unicode轉做某種格式的意思。
UTF-8便於不同的計算機之間使用網絡傳輸不同語言和編碼的文字,使得雙字節的Unicode能夠在現存的處理單字節的系統上正確傳輸。
UTF-8使用可變長度字節來儲存 Unicode字符,例如ASCII字母繼續使用1字節儲存,重音文字、希臘字母或西裏爾字母等使用2字節來儲存,而常用的漢字就要使用3字節。輔助平面字符則使用4字節。
UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字符編碼,又稱萬國碼。由Ken Thompson於1992年創建。現在已經標準化爲RFC 3629。UTF-8用1到6個字節編碼UNICODE字符。用在網頁上可以同一頁面顯示中文簡體繁體及其它語言(如英文,日文,韓文)。
比較

*UTF-16 和 UTF-32 編碼*
UTF-32、UTF-16和 UTF-8 是 Unicode 標準的編碼字符集的字符編碼方案,UTF-16 使用一個或兩個未分配的 16 位代碼單元的序列對 Unicode 代碼點進行編碼;UTF-32 即將每一個 Unicode 代碼點表示爲相同值的 32 位整數。

參考博文
ASCII、Unicode、GBK和UTF-8字符編碼的區別聯繫
字符編碼詳解——徹底理解掌握編碼知識,“亂碼”不復存在

英文字母和中文漢字在不同字符集編碼下的字節數

英文字母:

字節數 : 1;編碼:GB2312

字節數 : 1;編碼:GBK

字節數 : 1;編碼:GB18030

字節數 : 1;編碼:ISO-8859-1

字節數 : 1;編碼:UTF-8

字節數 : 4;編碼:UTF-16

字節數 : 2;編碼:UTF-16BE

字節數 : 2;編碼:UTF-16LE

中文漢字:

字節數 : 2;編碼:GB2312

字節數 : 2;編碼:GBK

字節數 : 2;編碼:GB18030

字節數 : 1;編碼:ISO-8859-1

字節數 : 3;編碼:UTF-8

字節數 : 4;編碼:UTF-16

字節數 : 2;編碼:UTF-16BE

字節數 : 2;編碼:UTF-16LE

實際問題

說說char型爲什麼可以存漢字
char 型只不過存的是字符集的遇射碼而已……就是一堆一定範圍內的整型數……傳統GB2312碼,是兩個 char 元素表示一個漢字,第一個 char 值爲負值,這就告訴系統,這是一個非ASCII字符,需要再讀取其後面的一個,就是兩個成一對兒,然後找漢字或者其它非ASCII字符集去映射出是什麼字……
char 在java裏面是unicode,2個字節
在c/c++和delphi裏面 不是 unicode,只有一個字節

所以說char能不能存漢子和佔幾個字節是和字符集、字符編碼有關係的。

VC工程中的字符集工程屬性和字符編碼

一、工程字符集屬性
工程屬性裏,字符集可以選擇“Use Unicode Character Set”和“Use Multi-Byte Character Set”。此選項只控制代碼裏的API是用寬字符版的還是ANSI字符版的,它控制不了代碼裏的字符是用Unicode編碼還是ANSI編碼。

如果選擇了“Use Unicode Character Set”,則代碼裏用到的API被解釋爲UNICODE版本的API(帶標記W的API),如MessageBox被解釋爲MessageBoxW;
如果選擇了“Use Multi-Byte Character Set”,則代碼裏用到的API被解釋爲ANSI編碼版本的API(帶標記A的API),如MessageBox被解釋爲MessageBoxA。

二 、字符編碼
假設當前OS的字符集爲GBK,則:
1 源代碼文件裏面的字符集

 使用當前OS的字符集GBK保存源程序,如“中”字的編碼值爲[0xD6,0xD0]。則在源程序的cpp文件中“中”字就是編碼值[0xD6,0xD0]的形式保存。

2 運行時字符串變量的字符集
字符變量的字符編碼是由操作系統的字符集和前綴L來決定的:
1> 如果字符串常量前面如果有標識L,則無論系統的字符集是什麼,被此字符串賦值的變量的內容都是Unicode編碼的。編譯器會將在cpp文件中以GBK編碼保存的“中”字對應的UNICODE編碼的值0x4E2D賦值給字符串變量。
2> 如果字符串常量前面沒有標識L,那麼被此字符串賦值的變量的內容是編譯器默認字符集編碼方式(VC編譯器默認的字符集是操作系統的字符集,此例爲GBK)。

運行時,如OS爲GBK字符集時,漢字”中”運行時的編碼值爲:這裏寫圖片描述

OS爲BIG5字符集時,漢字”中”運行時的編碼值爲:這裏寫圖片描述

這兩個對比證明正如第2條所說,沒有帶L時,賦值的字符串變量的內容是按照當前操作系統的字符集來編碼的。

如何修改windows的字符集?通過控制面板裏的地區和語言,修改current system locacle即可。

如何查看當前windows的字符集?
打開命令提示符,在標題欄點右鍵,選擇“屬性”。
在選項卡的“選項”裏會發現:
當前代碼頁
936 (ANSI/OEM - 簡體中文 GBK)這裏寫圖片描述

其他參考博文:
C/C++對漢字的讀取
Windows字符編碼那些事兒

查看本地windows的字符集方法

1.第一種方法是在cmd命令行界面上通過chcp命令查看
C:>chcp
Active code page: 936
2.第二種方法是在cmd命令行標題欄右鍵屬性,在彈出對話框內可以看到當前的字符集編碼
Windows Codepage: 936 (Simplified Chinese GBK)
字符,字節和編碼


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