4.MBCS、DBCS
前面說的ASCII,EASCII,ISO-8859中的每個字符使用的是8-bits表示的,所以稱為“ 單字節字符集 ”(Single-Byte Character Set,簡稱SBCS)。
但是到了亞洲,如中,日,韓等國家每個文字就是一個字符,對于單字節的字符集來,遠遠放不下了,于是亞洲國家制定了自己的字符集“多字節字符集” (Multi-Bytes Character Sets,簡稱MBCS)
windows 系統中,本地字符集就是MBCS,不過由于大部分字符是2字節的,所以又稱為“雙字節字符集”(Double-Bytes Character Sets,簡稱DBCS),所以有的時候看到MBCS、DBCS,都是一回事。 MBCS是完全兼容標準ASCII碼的 。
5.GB2312、GBK、
當計算機被引入中國后,相關部門設計了GB系列規范(GB為國家的拼音縮寫)。按照GB系列編碼方案,在一段文本中,如果一個字節是0~127,那么這個字節的含義與ASCII編碼相同,否則,這個字節和下一個字節共同組成漢字(或是GB編碼定義的其他字符)。因此,GB系列編碼方案向下完全直接兼容ASCII編碼方案。也就是說,如果當前文本中使用的字符全是ASCII中的字符,則其GB編碼和ASCII編碼是完成一樣的。
GB2312是最早的GB編碼格式,收入了不足一萬個漢字,基本能滿足日常需求,但是中國文件可是博大精深,區區一萬字肯定無法滿足,于是又在GB2312基礎上進行了擴展, 擴展后的編碼方案稱之為GBK (K是擴的拼音縮寫),后來又在GBK的基礎上擴了GB18030編碼方案,增加了一些少數名族的文字,一些生僻字被編到4個字節。
GB2312,GBK,GB18030(不包括GB13000)每次擴展都會完全兼容前一個版本 。這里要指出,雖然都用多個字節表示一個字符,但是GB類的漢字編碼與后文的Unicode編碼方案的UTF-8、UTF-16、UTF-32等字符編碼方式是毫無關系的
不過,也正因為不得不使用多個字節來表示一個字符,相較于只使用單個字節的ASCII編碼方案,GB系列編碼方案與后面要介紹的Unicode編碼方案一樣,無疑導致了更高的復雜度(包括時間復雜度、空間復雜度等)。
比如, 當多字節字符與原先的ASCII字符混用時 :
- 1) 要么將原先的ASCII字符重新編碼為多個字節表示,以便與其他多字節字符統一起來(UTF-16、UTF-32等采用的就是這種方法 );
- 2)要么保持ASCII字符為單個字節編碼不變,但將其他多字節字符編碼中的各個字節的最高位(即首位)設為1,以避免與字節最高位為0的ASCII編碼相沖突(GB、UTF-8等采用的就是這種方法) 。
前者具有更高的空間復雜度,因為原先只需要單個字節表示的ASCII字符,現在也必須用多個字節來表示,顯然更為耗費存儲空間;后者則具有更高的時間復雜度,因為為了避免沖突以及其他種種考慮(比如擴展性、容錯性等),使用了更為復雜的編碼算法(Encoding Algorithm),無疑更為耗費計算時間。
GB2312
GB2312編碼方案,即《信息交換用漢字編碼字符集——基本集》,是由中國國家標準總局于1980年發布、1981年5月1日開始實施的一套國家標準,標準號為GB2312-1980。
GB2312編碼適用于漢字處理、漢字通信等系統之間的信息交換,通行于中國大陸 ;新加坡等地也采用此編碼。中國大陸幾乎所有的中文系統和國際化的軟件都支持GB2312。
GB2312編碼為了兼容ASCII碼,所有的編碼的字節都是從0x7F之后開始的,一個漢字使用兩字節來表示,一個高字節一個低字節,如果一個字節的小余0x7F的值,則表示的是一個ASCII碼值。
雖然GB2312完全兼容ASCII碼,但是其并不兼容其他擴碼,如EASCII。
GB2312標準共收錄6763個漢字,其中一級漢字3755個,二級漢字3008個;同時,除了漢字,GB2312還收錄了包括拉丁字母、希臘字母、日文平假名及片假名字符、俄語西里爾字母在內的 682個字符 。
可能是處于美觀的考慮,除了漢字外的682個字符中,包括ASCII里本來就有的數字、標點、字母等字符,又再次編寫了兩字長的GB2312版本。 這682個雙字節編碼字符就是常說的“全角”字符,而這些字符所對應的單字節編碼的ASCII字符就被稱之為“半角”字符。
全角、半角
全角字符是中文顯示及雙字節中文編碼的歷史遺留問題。
早期的點陣顯示器上由于像素有限,原先ASCII西文字符的顯示寬度(比如8像素的寬度)用來顯示漢字有些捉襟見肘(實際上早期的針式打印機在打印輸出時也存在這個問題),因此就采用了兩倍于ASCII字符的顯示寬度(比如16像素的寬度)來顯示漢字。
這樣一來,ASCII西文字符在顯示時其寬度為漢字的一半。或許是為了在西文字符與漢字混合排版時,讓西文字符能與漢字對齊等視覺美觀上的考慮,于是就設計了讓西文字母、數字和標點等特殊字符在外觀視覺上也占用一個漢字的視覺空間(主要是寬度),并且在內部存儲上也同漢字一樣使用2個字節進行存儲的方案。這些與漢字在顯示寬度上一樣的西文字符就被稱之為全角字符。
而原來ASCII中的西文字符由于在外觀視覺上僅占用半個漢字的視覺空間(主要是寬度),并且在內部存儲上使用1個字節進行存儲,相對于全角字符,因而被稱之為半角字符。
后來,其中的一些全角字符因為比較有用,就得到了廣泛應用(比如全角的逗號“,”、問號“?”、感嘆號“!”、空格“”等,這些字符在輸入法中文輸入狀態下的半角與全角是一樣的,英文輸入狀態下全角跟中文輸入狀態一樣,但半角大約為全角的二分之一寬),專用于中日韓文本,成為了標準的中日韓標點字符。而其它的許多全角字符則逐漸失去了價值(現在很少需要讓純文本的中文和西文字符對齊了),就很少再用了。
現在全球字符編碼的事實標準是Unicode字符集及基于此的UTF-8、UTF-16等編碼實現方式。Unicode吸納了許多遺留(legacy)編碼,并且為了兼容性而保留了所有字符。因此中文編碼方案中的這些全角字符也保留下來了,而國家標準也仍要求字體和軟件都支持這些全角字符。
不過,半角和全角字符的關系在UTF-8、UTF-16等中不再是簡單的1字節和2字節的關系了。具體參見后文。
GBK
GB2312-1980共收錄6763個漢字,覆蓋了中國大陸99.75%的使用頻率,基本滿足了漢字的計算機處理需要。
但對于人名、古漢語等方面出現的罕用字、生僻字,GB2312不能處理,如部分在GB2312-1980推出以后才簡化的漢字(如“啰”)、部分人名用字(如歌手陶喆的“喆”字)、臺灣及香港使用的繁體字、日語及朝鮮語漢字等,并未收錄在內。
于是全國信息技術標準化技術委員會利用GB2312-1980未使用的碼點空間,收錄GB13000.1-1993的全部字符,于1995年12月1日發布了《漢字內碼擴展規范(GBK)》(Guo-Biao Kuozhan國家標準擴展碼,是根據GB13000.1-1993(GB13000下文有詳細介紹),對GB2312-1980的擴展;英文全稱Chinese Internal Code Specification)
雖然GBK跟GB2312一樣是雙字節編碼,但GBK只要求第一個字節即高字節大于127就固定表示這是一個漢字的開始(即GBK編碼高字節的首位必須是1;0~127當然表示的還是ASCII字符),不再像GB2312一樣要求第二個字節即低字節也必須大于127(即GBK編碼低字節首位既可以是0,也可以是1)。
正因為如此,作為同樣是雙字節編碼的GBK才可以收錄比GB2312更多的字符。
GBK字符集向后完全兼容GB2312,同時還支持GB2312-1980不支持的部分中文簡體、中文繁體、日文(不過該字符集不支持韓國文字,也是其在實際使用中與Unicode字符集相比欠缺的部分),共收錄漢字21003個、符號883個,并提供1894個造字碼位,簡、繁體字融于一體。
GBK的編碼框架(Code Scheme):其中GBK/1收錄除GB2312字符外的其他增補字符,GBK/2收錄GB2312字符,GBK/3收錄CJK字符,GBK/4收錄CJK字符和增補字符,GBK/5為非中文字符,UDC為用戶自定義字符
GB18030
中國國家質量技術監督局于2000年3月17日推出了GB18030-2000標準,以取代GBK。GB18030-2000除保留全部GBK編碼漢字之外,在第二字節再度進行擴展,增加了大約一百個漢字及四位元組編碼空間。
GB18030《信息交換用漢字編碼字符集基本集的補充》是我國繼GB2312-1980和GB13000-1993之后最重要的漢字編碼標準,是我國計算機系統必須遵循的基礎性標準之一。
2005年,GB18030編碼方案在GB18030-2000的基礎上又進行了擴充,于是又有了GB18030-2005《信息技術中文編碼字符集》。
如前所述,GB18030-2000是GBK的升級版本,它的主要特點是在GBK基礎上增加了CJK中日韓統一表意文字擴充A的漢字;而GB18030-2005的主要特點是在GB18030-2000基礎上又增加了CJK中日韓統一表意文字擴充B的漢字。
微軟也為GB18030定義了專門的代碼頁:CP54936,但是這個代碼頁實際上并沒有真正使用(在Windows 7的“控制面板”-“區域和語言”-“管理”-“非Unicode程序的語言”中沒有提供選項;在Windows cmd命令行中可通過命令chcp 54936更改,之后在cmd中可顯示中文,但卻不支持中文輸入)。
GB13000
在所有的GB編碼方案中,除了逐步擴展并保持向下兼容的GB2312、GBK、GB18030等GB系列編碼方案,還有一個與GB2312、GBK、GB18030等GB系列編碼方案不兼容的、 特殊的GB編碼方案——GB13000編碼方案 。(注意,雖然GBK的制定,主要目的就是為了收錄GB13000中的所有字符,但G BK的編碼方式與GB13000是完全不同的 。因此,習慣上所稱的GB系列編碼方案一般并不包括GB13000在內。)
為了對世界各個國家和地區的所有字符進行統一編碼,以實現對世界上所有字符在計算機上的統一處理,國際標準化組織制定了新的編碼標準——ISO/IEC 10646標準(即Universal Character Set通用字符集,簡稱UCS,與統一聯盟制定的Unicode標準兼容,兩者的關系詳見后文)。
為了與國際標準接軌,中國于是制定了與ISO/IEC 10646.1:1993標準相對應的中國國家標準——GB13000.1-1993 《信息技術通用多八位編碼字符集(UCS)第一部分:體系結構與基本多文種平面》。
2010年又發布了其替代標準——GB13000-2010《信息技術通用多八位編碼字符集(UCS)》,此標準等同于國際標準ISO/IEC 10646:2003《信息技術通用多八位編碼字符集(UCS)》。
GB13000與國際標準ISO/IEC10646及Unicode標準目前在基本平面(即BMP,詳見后文)上基本保持一致。
各漢字(中文字符)編碼方案之間的關系(Big5為繁體漢字編碼方案,主要通行于港澳臺地區,本文不作詳細介紹)
6.ANSI 編碼
ANSI原意是指美國國家標準協會,但是在windows系統中,ANSI編碼意思卻代表“本地編碼”。 。也就是說,在中國代表GBK,在臺灣代表Big5,在日本代表JIS,所以windows編程中常說的ANSI字符串,就是指本地編碼的字符串,在中國,就是一種DBCS,用1個和2個字節表示一個字符的編碼。
這也就是我們使用Notepad++進行文件編寫的時候,會默認給我們提供ANSI的編碼格式,其實就是GBK編碼啦。
事實上并沒有ANSI編碼,ANSI是什么,是American National Standards Institute美國國家標準協會,協會,機構而已。ANSI也有自己的ASCII標準。但是我們看到的這個ANSI并不是特指ANSI的ASCII標準,這個應該指所有的本地化編碼。
這個是微軟的鍋 。一開始只有英文操作系統,用ANSI表示ANSI的Extend ASCII編碼。但是到了歐洲就是ISO-8859-1編碼,到中國應該是GBK編碼,日本應該是JIS編碼等等,為了把實際編碼的差異隱藏起來,用所謂的ANSI編碼來表示所有Windows系統上的地區化編碼,然后操作系統自己做轉換,不同的國家地區,就會對應不同的編碼規范。ANSI應該叫地區化編碼,只出現在Windows系統中,就好像一種工廠模式,被Windows系統用來統一地區化編碼的叫法。
-
計算機
+關注
關注
19文章
7536瀏覽量
88642 -
編碼
+關注
關注
6文章
957瀏覽量
54951 -
BUG
+關注
關注
0文章
155瀏覽量
15723
發布評論請先 登錄
相關推薦
評論