前言
計(jì)算機(jī)中的信息包括數(shù)據(jù)信息和控制信息,數(shù)據(jù)信息又可分為數(shù)值和非數(shù)值信息。非數(shù)值信息和控制信息包括了字母、各種控制符號(hào)、圖形符號(hào)等,它們都以二進(jìn)制編碼方式存入計(jì)算機(jī)并得以處理,這種對(duì)字母和符號(hào)進(jìn)行編碼的 二進(jìn)制代碼稱為字符代碼(Character Code)。計(jì)算機(jī)中常用的字符編碼有 ASCII碼(美國(guó)標(biāo)準(zhǔn)信息交換碼)和 ebcdic碼(擴(kuò)展的 bcd交換碼)。
(Unicode與 ucs)歷史上有兩個(gè)獨(dú)立的創(chuàng)立單一字符集的組織:一個(gè)是國(guó)際標(biāo)準(zhǔn)化組織 IOS開(kāi)展了 IOS/Iec 10646項(xiàng)目,名字叫“ Universal Multiple-Octet Coded Character Set”,簡(jiǎn)稱 ucs。, 另一個(gè)是由統(tǒng)一碼聯(lián)盟多語(yǔ)言軟件制造商組成的協(xié)會(huì)組織的 Unicode 項(xiàng)目——Unicode。
1991年,Unicode聯(lián)盟與 IOS的工作組終于開(kāi)始討論 Unicode與 ucs的合并問(wèn)題,雖然其后的合并進(jìn)行了很多年,Unicode初版規(guī)范中的很多編碼都需要被改寫(xiě),Ucs也需要對(duì)碼空間的使用進(jìn)行必要限制,但成果是喜人的。
最終,兩者統(tǒng)一了抽象字符集(即任何一個(gè)在 Unicode中存在的字符,在 ucs中也存在),且最靠前的65535個(gè)字符也統(tǒng)一了字符的編碼。對(duì)于碼空間,兩者同意以一百一十萬(wàn)為限(即兩者都認(rèn)為雖然65536不夠,但2的31次方又太大,一百一十萬(wàn)是個(gè)雙方都可接受的碼空間大小,也夠用,當(dāng)然,這里說(shuō)的一百一十萬(wàn)只是個(gè)約數(shù)),Unicode將碼空間擴(kuò)展到了一百一十萬(wàn),而 ucs將永久性的不使用一百一十萬(wàn)以后的碼位。
也就是說(shuō),現(xiàn)在再講 Unicode只包含65536個(gè)字符是不對(duì)的(Unicode 標(biāo)準(zhǔn)曾做過(guò)修改,以允許那些其表示形式需要超過(guò) 16 位的字符。合法代碼點(diǎn) 的范圍現(xiàn)在是從 U+0000 到 U+10ffff,即通常所說(shuō)的 Unicode 標(biāo)量值,從 U+0000 到 U+Ffff 的字符集有時(shí)也稱為 Basic Multilingual Plane (Bmp)。代碼點(diǎn)大于 U+Ffff的字符稱為增補(bǔ)字符。)。除了對(duì)已經(jīng)定義的字符進(jìn)行統(tǒng)一外,Unicode聯(lián)盟與 IOS工作組也同意今后任何的擴(kuò)展工作兩者均保持同步,到 Unicode2.0時(shí),Unicode的編碼和 ucs的編碼都基本一致。因此雖然從歷史的意義上講 Unicode與 ucs不是一回事(甚至細(xì)節(jié)上說(shuō)也不是一回事),但現(xiàn)在提起 Unicode,指代兩者均無(wú)不妥,也就是說(shuō)"Unicode"與"Ucs"一樣。GB2312編碼漢字6763字,是在 windows 95出現(xiàn)以前,國(guó)內(nèi)信息處理普遍采用的編碼標(biāo)準(zhǔn)。GBK是在保持 GB2312原貌的基礎(chǔ)上,將其字匯擴(kuò)充至 IOS 10646中的 CJK 20902漢字,同時(shí)也就包容了臺(tái)灣的工業(yè)標(biāo)準(zhǔn) big5中的全部漢字,沒(méi)有體系結(jié)構(gòu)的變化。而 GB18030則不然,它是在 GBK的基礎(chǔ)上做進(jìn)一步擴(kuò)充,不但把 CJK-擴(kuò)展 a的6582漢字?jǐn)U充進(jìn)去,而且還改變了 GBK的體系結(jié)構(gòu)。盡管 GB2312、Big5、GBK在某種程度上依然尚存,但 IOS 10646(GB13000/Unicode)已日漸成為主流編碼。
查看工具
Windows有個(gè)系統(tǒng)工具叫做字符映射表,可以查看字體中的可用字符:開(kāi)始--運(yùn)行--Charmap.
Babelmap【字符映射表/字體瀏覽工具】比 windows自帶的好用?誰(shuí)知道呢.最新版本的 Babelmap支持 Unicode6.0.該軟件可使用系統(tǒng)上安裝的所有字體瀏覽 Unicode 標(biāo)準(zhǔn)中的所有字符,還帶有拼音及部首檢字法。
說(shuō)明
字符集 是一種語(yǔ)言或多個(gè)或全部語(yǔ)言中所有不同文字的集合,在中文中尤為明顯,GB2312和 GBK就是兩種中文字符集。
字體是某種文字不同的美術(shù)字形,比如中文的宋體、楷體…………
字符集和字體有一些關(guān)系,比如,微軟的宋體就包含了 GBK字符集的所有文字,而楷體就只 GB-2312中常用的6000多漢字的字形。
字符集是一個(gè)映射表。一個(gè)字符是用二進(jìn)制數(shù)字表示的,但具體是什么字符,是根據(jù)字符集決定的。
字庫(kù)有兩種標(biāo)準(zhǔn): Postscript字庫(kù)和TrueType字庫(kù)。這兩種字體標(biāo)準(zhǔn)都是采用曲線方式描述字體輪廓,因此都可以輸出很高質(zhì)量的字形。TTF(TrueTypefont)是一種字庫(kù)名稱。TTF(TrueTypefont)是 apple公司和 Microsoft公司共同推出的字體文件格式,隨著 windows的流行,已經(jīng)變成最常用的一種字體文件表示方式。
ASCII (國(guó)際標(biāo)準(zhǔn) IOS-646)
ASCII規(guī)定用7位二進(jìn)制數(shù)字來(lái)表示英文字符,ASCII被定為國(guó)際標(biāo)準(zhǔn)之后的代號(hào)為 IOS-646。由于 ASCII碼只使用了7個(gè)二進(jìn)制位,也就是說(shuō)一個(gè)字節(jié)可以表示的256個(gè)數(shù)字中,它僅使用了0~127這128個(gè)碼位,剩下的128個(gè)碼位便可以用來(lái)做擴(kuò)展,用來(lái)表示一些特定語(yǔ)言所獨(dú)有的字符,因此對(duì)這多余的128個(gè)碼位的不同擴(kuò)展,就形成了一系列 IOS-8859-*的標(biāo)準(zhǔn)。例如為英語(yǔ)作了專(zhuān)門(mén)擴(kuò)展的字符集編碼標(biāo)準(zhǔn)編號(hào)為 IOS-8859-1,也叫做 latin-1,為希臘語(yǔ)所作的擴(kuò)展編號(hào)為 IOS-8859-7等,完整的列表可以參考《Java Internationalization》一書(shū)。
ASCII碼于1961年提出,用于在不同計(jì)算機(jī)硬件和軟件系統(tǒng)中實(shí)現(xiàn)數(shù)據(jù)傳輸標(biāo)準(zhǔn)化,在大多數(shù)的小型機(jī)和全部的個(gè)人計(jì)算機(jī)都使用此碼。ASCII碼劃分為兩個(gè)集合:128個(gè)字符的標(biāo)準(zhǔn) ASCII碼和附加的128個(gè)字符的擴(kuò)充和 ASCII碼。比較 ebcdic。其中95個(gè)字符可以顯示。另外33個(gè)不可以顯示。 標(biāo)準(zhǔn) ASCII碼為7位,擴(kuò)充為8位。
目前使用最廣泛的西文字符集及其編碼是 ASCII 字符集和 ASCII 碼( ASCII 是 American Standard Code For Information Interchange 的縮寫(xiě)),它同時(shí)也被國(guó)際標(biāo)準(zhǔn)化組織( International Organization For Standardization, IOS )批準(zhǔn)為國(guó)際標(biāo)準(zhǔn)。
031及127(共33個(gè))是控制字符或通信專(zhuān)用字符(其余為可顯示字符),如控制符:Lf(換行)、Cr(回車(chē))、Ff(換頁(yè))、Del(刪除)、Bs(退格)、Bel(振鈴)等;通信專(zhuān)用字符:Soh(文頭)、Eot(文尾)、Ack(確認(rèn))等;ASCII值為8、9、10和13分別轉(zhuǎn)換為退格、制表、換行和回車(chē)字符。它們并沒(méi)有特定的圖形顯示,但會(huì)依不同的應(yīng)用程序而對(duì)文本顯示有不同的影響。32126(共95個(gè))是字符(32sp是空格),其中4857為0到9十個(gè)阿拉伯?dāng)?shù)字,6590為26個(gè)大寫(xiě)英文字母,97~122為26個(gè)小寫(xiě)字母,其余為一些標(biāo)點(diǎn)符號(hào)、運(yùn)算符號(hào)等。
Mbcs(Muilti-Bytes Charecter Set,多字節(jié)字符集)
為了擴(kuò)充 ASCII編碼,以用于顯示本國(guó)的語(yǔ)言,不同的國(guó)家和地區(qū)制定了不同的標(biāo)準(zhǔn),由此產(chǎn)生了 GB2312, Big5, Jis 等各自的編碼標(biāo)準(zhǔn)。這些使用 2 個(gè)字節(jié)來(lái)代表一個(gè)字符的各種漢字延伸編碼方式,稱為 Ansi 編碼,又稱為"Mbcs(Muilti-Bytes Charecter Set,多字節(jié)字符集)"。在簡(jiǎn)體中文系統(tǒng)下,Ansi 編碼代表 GB2312 編碼,在日文操作系統(tǒng)下,Ansi 編碼代表 Jis 編碼,所以在中文 Windows下要轉(zhuǎn)碼成 GB2312,GBK只需要把文本保存為 ansi 編碼即可。 不同 Ansi 編碼之間互不兼容,當(dāng)信息在國(guó)際間交流時(shí),無(wú)法將屬于兩種語(yǔ)言的文字,存儲(chǔ)在同一段 Ansi 編碼的文本中。一個(gè)很大的缺點(diǎn)是,同一個(gè)編碼值,在不同的編碼體系里代表著不同的字。這樣就容易造成混亂。導(dǎo)致了 Unicode碼的誕生。
其中每個(gè)語(yǔ)言下的 ansi編碼,都有一套一對(duì)一的編碼轉(zhuǎn)換器,Unicode變成所有編碼轉(zhuǎn)換的中間介質(zhì)。所有的編碼都有一個(gè)轉(zhuǎn)換器可以轉(zhuǎn)換到 Unicode,而 Unicode也可以轉(zhuǎn)換到其他所有的編碼。
Unicode與 ucs(國(guó)際通用字符集)
Unicode當(dāng)然是一個(gè)很大的集合,現(xiàn)在的規(guī)??梢匀菁{100多萬(wàn)個(gè)符號(hào)。
Unicode只是一個(gè)符號(hào)集,它只規(guī)定了符號(hào)的二進(jìn)制代碼,卻沒(méi)有規(guī)定這個(gè)二進(jìn)制代碼應(yīng)該如何存儲(chǔ)。
比如,漢字“嚴(yán)”的 Unicode是十六進(jìn)制數(shù)4e25,轉(zhuǎn)換成二進(jìn)制數(shù)足足有15位(100111000100101),也就是說(shuō)這個(gè)符號(hào)的表示至少需要2個(gè)字節(jié)。表示其他更大的符號(hào),可能需要3個(gè)字節(jié)或者4個(gè)字節(jié),甚至更多。
這里就有兩個(gè)嚴(yán)重的問(wèn)題,第一個(gè)問(wèn)題是,如何才能區(qū)別 Unicode和 ASCII?計(jì)算機(jī)怎么知道三個(gè)字節(jié)表示一個(gè)符號(hào),而不是分別表示三個(gè)符號(hào)呢?第二個(gè)問(wèn)題是,我們已經(jīng)知道,英文字母只用一個(gè)字節(jié)表示就夠了,如果 Unicode統(tǒng)一規(guī)定,每個(gè)符號(hào)用三個(gè)或四個(gè)字節(jié)表示,那么每個(gè)英文字母前都必然有二到三個(gè)字節(jié)是0,這對(duì)于存儲(chǔ)來(lái)說(shuō)是極大的浪費(fèi),文本文件的大小會(huì)因此大出二三倍,這是無(wú)法接受的。
它們?cè)斐傻慕Y(jié)果是:
- 出現(xiàn)了 Unicode的多種存儲(chǔ)方式,也就是說(shuō)有許多種不同的二進(jìn)制格式,可以用來(lái)表示 Unicode。
- Unicode在很長(zhǎng)一段時(shí)間內(nèi)無(wú)法推廣,直到互聯(lián)網(wǎng)的出現(xiàn)。
為什么使用 Unicode其實(shí)原因很簡(jiǎn)單,因?yàn)?Unicode比 ansi好用。 自從 windows2k開(kāi)始,Win的系統(tǒng)內(nèi)核開(kāi)始完全支持并完全應(yīng)用 Unicode編寫(xiě),所有 ansi字符在進(jìn)入底層前,都會(huì)被相應(yīng)的 api轉(zhuǎn)換成 Unicode。所以,如果你一開(kāi)始就使用 Unicode,則可以減少轉(zhuǎn)換的用時(shí)和 ram開(kāi)銷(xiāo)。 對(duì)于 java/.Net等這些“新”的語(yǔ)言來(lái)說(shuō),內(nèi)置的字符串所使用的字符集已經(jīng)完全是 Unicode了,最重要的是,目前世界上大多數(shù)程序用的字符集都是 Unicode,因?yàn)閁nicode有利于程序國(guó)際化和標(biāo)準(zhǔn)化。
Unicode的另一個(gè)設(shè)計(jì)目標(biāo),對(duì)今天影響深遠(yuǎn),那就是對(duì)所有字符都采用16位編碼(即用一個(gè)大小不超過(guò)2的16次方的整數(shù)數(shù)字給每個(gè)字符編號(hào),注意從這個(gè)意義上也可以看出,Unicode是一種編碼字符集,而非字符集編碼)。說(shuō)這個(gè)設(shè)計(jì)目標(biāo)對(duì)現(xiàn)今影響深遠(yuǎn),完全不是表?yè)P(yáng),因?yàn)榈胶髞?lái)連 Unicode的設(shè)計(jì)者也發(fā)現(xiàn),16位編碼僅有65536個(gè)碼位,遠(yuǎn)遠(yuǎn)不能容納世界上所有的字符,但當(dāng)意識(shí)到這個(gè)問(wèn)題的時(shí)候,Unicode大部分的規(guī)范已經(jīng)制定完畢,也有相當(dāng)程度的普及,完全推倒重來(lái)是不現(xiàn)實(shí)的。這成了一個(gè)遺留問(wèn)題,也是 surrogate Pair這種蹩腳解決方案的發(fā)端。
IOS一開(kāi)始就確定了 ucs是一個(gè)31位的編碼字符集(即用一個(gè)大小不超過(guò)2的31次方的整數(shù)數(shù)字為每個(gè)字符編號(hào)),這回真的足以容納古往今來(lái)所有國(guó)家,所有語(yǔ)言所包含的字符了。雖然后來(lái)他們意識(shí)到,2的31次方個(gè)碼位又實(shí)在太多了
Unicode在編碼上和 ucs保持一致,在實(shí)現(xiàn)上有自己的規(guī)則,而 ucs只定義了編碼標(biāo)準(zhǔn)。Unicode的實(shí)現(xiàn)形式上 有 UTF-8,UTF-16,UTF-32,還有 UTF-7等。Ucs編碼也有自己的格式:UCS-2和 UCS-4等等。Unicode的編碼可以和 UCS-2和 UCS-4保持一致。但是又略有不同。UTF-16是 UCS-2的擴(kuò)展,UTF-32是 UCS-4的子集。也就是說(shuō),UTF-16的實(shí)現(xiàn)上對(duì) code Point的支持范圍超過(guò) UCS-2,而 UTF-32對(duì) code Point的表示卻又在 UCS-4的范圍之內(nèi)。在編碼層面上,UCS-2就是用兩個(gè)字節(jié)編碼,UCS-4就是用4個(gè)字節(jié)(實(shí)際上只用了31位,最高位必須為0)編碼。UCS-2有216=65536個(gè)碼位,UCS-4有231=2147483648個(gè)碼位。 UCS-4根據(jù)最高位為0的最高字節(jié)分成2^7=128個(gè) group。每個(gè) group再根據(jù)次高字節(jié)分為256個(gè) plane。每個(gè) plane根據(jù)第3個(gè)字節(jié)分為256行 (Rows),每行包含256個(gè) cells。當(dāng)然同一行的 cells只是最后一個(gè)字節(jié)不同,其余都相同。Group 0的 plane 0被稱作 basic Multilingual Plane, 即 bmp。或者說(shuō) UCS-4中,高兩個(gè)字節(jié)為0的碼位被稱作 bmp。 將 UCS-4的 bmp去掉前面的兩個(gè)零字節(jié)就得到了 UCS-2。在 UCS-2的兩個(gè)字節(jié)前加上兩個(gè)零字節(jié),就得到了 UCS-4的 bmp。而目前的 UCS-4規(guī)范中還沒(méi)有任何字符被分配在 bmp之外。
Unicode最初支持16位的 code Point,后來(lái)發(fā)現(xiàn)不夠用,于是用 UTF-16擴(kuò)展 UCS-2。在 bmp區(qū)域內(nèi)的一片連續(xù)空間(U+D800~U+Dfff)的碼位區(qū)段是永久保留不映射到字符,因此 UTF-16利用保留下來(lái)的0xd800-0xdfff區(qū)段的碼位來(lái)對(duì)輔助平面的字符的碼位進(jìn)行編碼。 所以,UTF-16能表示的范圍最大能到 u+10ffff,包含1個(gè)基本平面(Bmp)和16個(gè)輔助平面。
理論上 UCS-4編碼范圍能達(dá)到 u+7fffffff,但是因?yàn)?Unicode和 IOS達(dá)成共識(shí),只會(huì)用17個(gè)平面內(nèi)的字符,所以 UTF-32是 UCS-4的子集。但是 UTF-16是定長(zhǎng)的編碼,和 UCS-4無(wú)論實(shí)現(xiàn)和編碼都是基本一樣的。當(dāng)前,Unicode深入人心,且 UTF-8大行其道,Ucs編碼基本被等同于 UTF-16,UTF-32了,所以目前 ucs基本談出人們的視野中。(Windows Nt用的就是 UCS-2)
UTF-8
UTF-8就是在互聯(lián)網(wǎng)上使用最廣的一種 Unicode的實(shí)現(xiàn)方式。其他實(shí)現(xiàn)方式還包括 UTF-16和 UTF-32,不過(guò)在互聯(lián)網(wǎng)上基本不用。UTF-8是 Unicode即(Ucs)的實(shí)現(xiàn)方式之一。
UTF(Ucs Transformation Format) 代表“通用字符集轉(zhuǎn)換格式”。
UTF-8最大的一個(gè)特點(diǎn),就是它是一種變長(zhǎng)的編碼方式。它可以使用1~4個(gè)字節(jié)表示一個(gè)符號(hào),根據(jù)不同的符號(hào)而變化字節(jié)長(zhǎng)度。UTF-8的編碼規(guī)則很簡(jiǎn)單,只有二條:
對(duì)于單字節(jié)的符號(hào),字節(jié)的第一位設(shè)為0,后面7位為這個(gè)符號(hào)的Unicode碼。因此對(duì)于英語(yǔ)字母,UTF-8編碼和 ASCII碼是相同的。
對(duì)于 n字節(jié)的符號(hào)(N>1),第一個(gè)字節(jié)的前 n位都設(shè)為1,第n+1位設(shè)為0,后面字節(jié)的前兩位一律設(shè)為10。剩下的沒(méi)有提及的二進(jìn)制位,全部為這個(gè)符號(hào)的 Unicode碼。
下表總結(jié)了編碼規(guī)則,字母 x表示可用編碼的位。
Unicode符號(hào)范圍 | UTF-8編碼方式
(十六進(jìn)制) | (二進(jìn)制)
--------------------+---------------------------------------------
0000 0000-0000 007f | 0xxxxxxx
0000 0080-0000 07ff | 110xxxxx 10xxxxxx
0000 0800-0000 Ffff | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 Ffff | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
下面,還是以漢字“嚴(yán)”為例,演示如何實(shí)現(xiàn) UTF-8編碼。
已知“嚴(yán)”的 Unicode是4e25(100111000100101),根據(jù)上表,可以發(fā)現(xiàn)4e25處在第三行的范圍內(nèi)(0000 0800-0000 Ffff),因此“嚴(yán)”的 UTF-8編碼需要三個(gè)字節(jié),即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后,從“嚴(yán)”的最后一個(gè)二進(jìn)制位開(kāi)始,依次從后向前填入格式中的 x,多出的位補(bǔ)0。這樣就得到了,“嚴(yán)”的 UTF-8編碼是“11100100 10111000 10100101”,轉(zhuǎn)換成十六進(jìn)制就是 e4b8a5。
Unicode與 UTF-8之間的轉(zhuǎn)換
可以看到“嚴(yán)”的 Unicode碼是4e25,UTF-8編碼是 e4b8a5,兩者是不一樣的。它們之間的轉(zhuǎn)換可以通過(guò)程序?qū)崿F(xiàn)。 在 windows平臺(tái)下,有一個(gè)最簡(jiǎn)單的轉(zhuǎn)化方法,就是使用內(nèi)置的記事本小程序 notepad.Exe。打開(kāi)文件后,點(diǎn)擊“文件”菜單中的“另存為”命令,會(huì)跳出一個(gè)對(duì)話框,在最底部有一個(gè)“編碼”的下拉條。 里面有四個(gè)選項(xiàng):Ansi,Unicode,Unicode Big Endian 和 UTF-8。
Ansi是默認(rèn)的編碼方式。對(duì)于英文文件是 ASCII編碼,對(duì)于簡(jiǎn)體中文文件是 GB2312編碼(只針對(duì) windows簡(jiǎn)體中文版,如果是繁體中文版會(huì)采用 big5碼)。
Unicode編碼指的是 UCS-2編碼方式,即直接用兩個(gè)字節(jié)存入字符的 Unicode碼。這個(gè)選項(xiàng)用的 little Endian格式。
Unicode Big Endian編碼與上一個(gè)選項(xiàng)相對(duì)應(yīng)。我在下一節(jié)會(huì)解釋 little Endian和 big Endian的涵義。
UTF-8編碼,也就是上一節(jié)談到的編碼方法。
選擇完”編碼方式“后,點(diǎn)擊”保存“按鈕,文件的編碼方式就立刻轉(zhuǎn)換好了。
Little Endian和 Big Endian 的區(qū)別
上一節(jié)已經(jīng)提到,Unicode碼可以采用 UCS-2格式直接存儲(chǔ)。以漢字”嚴(yán)“為例,Unicode碼是4e25,需要用兩個(gè)字節(jié)存儲(chǔ),一個(gè)字節(jié)是4e,另一個(gè)字節(jié)是25。存儲(chǔ)的時(shí)候,4e在前,25在后,就是 Big Endian 方式;25在前,4e在后,就是 Little Endian 方式。
這兩個(gè)古怪的名稱來(lái)自英國(guó)作家斯威夫特的《格列佛游記》。在該書(shū)中,小人國(guó)里爆發(fā)了內(nèi)戰(zhàn),戰(zhàn)爭(zhēng)起因是人們爭(zhēng)論,吃雞蛋時(shí)究竟是從大頭(Big-Endian)敲開(kāi)還是從小頭(Little-Endian)敲開(kāi)。為了這件事情,前后爆發(fā)了六次戰(zhàn)爭(zhēng),一個(gè)皇帝送了命,另一個(gè)皇帝丟了王位。
因此,第一個(gè)字節(jié)在前,就是”大頭方式“(Big Endian),第二個(gè)字節(jié)在前就是”小頭方式“(Little Endian)。那么很自然的,就會(huì)出現(xiàn)一個(gè)問(wèn)題:計(jì)算機(jī)怎么知道某一個(gè)文件到底采用哪一種方式編碼?Unicode規(guī)范中定義,每一個(gè)文件的最前面分別加入一個(gè)表示編碼順序的字符,這個(gè)字符的名字叫做”零寬度非換行空格“(Zero Width No-Break Space),用 feff表示。這正好是兩個(gè)字節(jié),而且 ff比 fe大1。 如果一個(gè)文本文件的頭兩個(gè)字節(jié)是 fe Ff,就表示該文件采用大頭方式;如果頭兩個(gè)字節(jié)是 ff Fe,就表示該文件采用小頭方式。
打開(kāi)”記事本“程序 notepad.Exe,新建一個(gè)文本文件,內(nèi)容就是一個(gè)”嚴(yán)“字,依次采用 ansi,Unicode,Unicode Big Endian 和 UTF-8編碼方式保存。 然后,用文本編輯軟件 ultraedit中的”十六進(jìn)制功能“,觀察該文件的內(nèi)部編碼方式。
Ansi:文件的編碼就是兩個(gè)字節(jié)“D1 Cf”,這正是“嚴(yán)”的 GB2312編碼,這也暗示 GB2312是采用大頭方式存儲(chǔ)的。
Unicode:編碼是四個(gè)字節(jié)“Ff Fe 25 4e”,其中“Ff Fe”表明是小頭方式存儲(chǔ),真正的編碼是4e25。
Unicode Big Endian:編碼是四個(gè)字節(jié)“Fe Ff 4e 25”,其中“Fe Ff”表明是大頭方式存儲(chǔ)。
UTF-8:編碼是六個(gè)字節(jié)“Ef Bb Bf E4 B8 A5”,前三個(gè)字節(jié)“Ef Bb Bf”表示這是 UTF-8編碼,后三個(gè)“E4b8a5”就是“嚴(yán)”的具體編碼,它的存儲(chǔ)順序與編碼順序是一致的。
- GB2312-80國(guó)家標(biāo)準(zhǔn) ——《信息交換用漢字編碼字符集--基本集》 1980年
1980年頒布了《信息交換用漢字編碼字符集—基本集》的國(guó)標(biāo)交換碼,國(guó)家標(biāo)準(zhǔn)號(hào)為:GB2312-80,選入了6763個(gè)漢字,分為兩級(jí),一級(jí)字庫(kù)中有3755個(gè),是常用漢字,二級(jí)字庫(kù)中有3008個(gè),是次常用漢字;還選入了682個(gè)字符,包含有數(shù)字、一般符號(hào)、拉丁字母、日本假名、希臘字母、俄文字母、拼音符號(hào)、注音字母等。以前我國(guó)大陸的各種中文 dos版本、Windows3.1 /3.2版本,裝入的字庫(kù)都是國(guó)標(biāo)一二級(jí)字庫(kù)。
《GB2312-80》對(duì) 7445 個(gè)圖形字符作了二進(jìn)制數(shù)編碼。
GB2312 也是 ansi編碼里的一種,對(duì) ansi編碼最初始的 ASCII編碼進(jìn)行擴(kuò)充,為了滿足國(guó)內(nèi)在計(jì)算機(jī)中使用漢字的需要,中國(guó)國(guó)家標(biāo)準(zhǔn)總局發(fā)布了一系列的漢字字符集國(guó)家標(biāo)準(zhǔn)編碼,統(tǒng)稱為 gb碼,或國(guó)標(biāo)碼。其中最有影響的是于1980年發(fā)布的《信息交換用漢字編碼字符集 基本集》,標(biāo)準(zhǔn)號(hào)為 gb 2312-1980,因其使用非常普遍,也常被通稱為國(guó)標(biāo)碼。GB2312編碼通行于我國(guó)內(nèi)地;新加坡等地也采用此編碼。幾乎所有的中文系統(tǒng)和國(guó)際化的軟件都支持 gb 2312。
Gb 2312是一個(gè)簡(jiǎn)體中文字符集,由6763個(gè)常用漢字和682個(gè)全角的非漢字字符組成。其中漢字根據(jù)使用的頻率分為兩級(jí)。一級(jí)漢字3755個(gè),二級(jí)漢字3008個(gè)。由于字符數(shù)量比較大,GB2312采用了二維矩陣編碼法對(duì)所有字符進(jìn)行編碼。首先構(gòu)造一個(gè)94行94列的方陣,對(duì)每一行稱為一個(gè)“區(qū)”,每一列稱為一個(gè)“位”,然后將所有字符依照下表的規(guī)律填寫(xiě)到方陣中。這樣所有的字符在方陣中都有一個(gè)唯一的位置,這個(gè)位置可以用區(qū)號(hào)、位號(hào)合成表示,稱為字符的區(qū)位碼。如第一個(gè)漢字“啊”出現(xiàn)在第16區(qū)的第1位上,其區(qū)位碼為1601。因?yàn)閰^(qū)位碼同字符的位置是完全對(duì)應(yīng)的,因此區(qū)位碼同字符之間也是一一對(duì)應(yīng)的。這樣所有的字符都可通過(guò)其區(qū)位碼轉(zhuǎn)換為數(shù)字編碼信息。
- Big5 ——《大五碼》 1984年
Big-5碼是通行于臺(tái)灣、香港地區(qū)的一個(gè)繁體字編碼方案,俗稱“大五碼”。地區(qū)標(biāo)準(zhǔn)號(hào)為:CNS11643,這就是人們講的 big-5碼。
Big-5碼收錄漢字13053個(gè),分為常用字和次常用字兩部分,各部分中的漢字按筆畫(huà)/部首排列。其中常用字5401個(gè),包括臺(tái)灣教育管理部門(mén)頒布的《常用漢字標(biāo)準(zhǔn)字體表》中的全部漢字4808個(gè),臺(tái)灣中小學(xué)教科書(shū)常用字587個(gè),異體字6個(gè);次常用字7652個(gè),包括臺(tái)灣教育管理部門(mén)頒布的《次常用漢字標(biāo)準(zhǔn)字體表》的全部漢字6341個(gè),《罕用漢字標(biāo)準(zhǔn)字體表》中使用頻率較高的字1311個(gè)。
Big-5碼的編碼范圍是 0x8140~0xfe7e、0x81a1~0xfefe,其中 0xa140~0xa17e、0xa1a1~0xa1fe 是圖形符號(hào)區(qū),0xa440~0xf97e、0xa4a1~0xf9fe 是漢字區(qū)。
- IOS10646.1國(guó)際標(biāo)準(zhǔn) —— 《通用多八位編碼字符集(Universal Character Set, Ucs) 》 1993年
國(guó)際標(biāo)準(zhǔn)化組織為了將世界各民族的文字進(jìn)行統(tǒng)一編碼,制定了 ucs標(biāo)準(zhǔn)。
國(guó)際標(biāo)準(zhǔn) IOS10646.1-1993定義了通用八位編碼字符集(Universal Character Set, Ucs),用于世界上各種語(yǔ)言的書(shū)面形式以及附加符號(hào)的表示、傳輸、交換、處理、存儲(chǔ)、輸入及顯現(xiàn)。 Ucs是所有其它字符集標(biāo)準(zhǔn)的一個(gè)超集,它保證也其它字符集雙向兼容,即編碼間相互轉(zhuǎn)換不會(huì)丟失任何信息。Ucs字符集 u+0000到 u+007f與 us-ASCII是一致的。
Ucs 的總體結(jié)構(gòu)
Ucs 編碼字符集的總體結(jié)構(gòu)是一個(gè)四維編碼空間,它包含 00 ~ 7f 共 128 個(gè)三維組,每一個(gè)三維組中包含 00 ~ Ff 共 256 個(gè)二維平面,每一個(gè)二維平面包含 00 ~ Ff 共 256 個(gè)一維行,每行共 256 個(gè)字位(00 ~ Ff),每個(gè)字位用一個(gè)字節(jié)二進(jìn)制數(shù)表示。因此在 Ucs 中每一個(gè)字符用 4 個(gè)二進(jìn)制數(shù)編碼,以確定每個(gè)字符在編碼空間的組、平面、行和字位。上述四個(gè) 8 位二進(jìn)制數(shù)編碼形式稱為 Ucs 的四八位正則形式,記作 UCS-4。基本多文種平面
在 ucs 編碼空間中 00組的 00平面稱為基本多文種平面。在此平面包含了字母文字、音節(jié)文字和表意文字中通常使用的字符以及各種符號(hào)和數(shù)字。
基本多文種平面的組編碼為 00h。Ucs 規(guī)定當(dāng)正則形式的組、平面編碼為 00h 時(shí)可以省略,因此安排在基本多文種平面上的字符可用兩個(gè)字節(jié)的二進(jìn)制數(shù)來(lái)表示,形成雙八位編碼字符集,記作 UCS-2。
基本多文種平面分成 A、I、O、R 四個(gè)區(qū)
A 區(qū):代碼位置從 0000 ~ 4dff,共 19903 個(gè)字位。此區(qū)用于字母文字、音節(jié)文字以及各種符號(hào)的編碼,其中 0000 ~ 001f 和 007e ~ 009f 保留用于控制字符。
I 區(qū):代碼位置從 4e00 ~ 9fff,共 20992 個(gè)字位。此區(qū)用于中、日、韓()統(tǒng)一的表意文字,即中國(guó)、日本、韓國(guó)等三國(guó)漢字的編碼。
O 區(qū):代碼位置從 A000 ~ Dfff,共 16384 個(gè)字位。此區(qū)目前未用,留作未來(lái)的標(biāo)準(zhǔn)化。
R 區(qū):代碼位置從 E000 ~ Fffd,共 8190 個(gè)字位。此區(qū)是限制使用區(qū),用于專(zhuān)用字符、變形顯現(xiàn)形式和兼容字符的編碼。
CJK 統(tǒng)一漢字的編碼
在 I 區(qū)統(tǒng)一編碼的漢字共 20902 個(gè),按部首—比畫(huà)排序。其中中國(guó)用漢字約 17000 個(gè),源字集是 Gb 基本集簡(jiǎn)化字,第一、三、五輔助集繁體字,現(xiàn)代漢語(yǔ)通用字表,郵電通信字符集,臺(tái)灣地區(qū)的 CNS11643 《通用漢字標(biāo)準(zhǔn)交換碼》,此外還吸收了香港用字 58 個(gè),延邊地區(qū)朝鮮族使用的“吏讀”字 92 個(gè)。CJK 統(tǒng)一漢字編碼字符集中日本用漢字和韓國(guó)用漢字源字集分別為日、韓兩國(guó)的有關(guān)標(biāo)準(zhǔn)。
CJK-擴(kuò)展 a
國(guó)際標(biāo)準(zhǔn)化組織在 IOS10646-2000 的基本平面(Bmp 或者 Unicode 3.0, 下簡(jiǎn)稱 Unicode)編入了27,564 漢字(U+4e00~U+9fff以及 u+3400~U+4dff),既是2000年3月在 GB18030頒布時(shí)所建議支持的字匯。其中 u+3400~U+4dff部分的6582個(gè)漢字又稱為 CJK-擴(kuò)展 a。
同時(shí)國(guó)際標(biāo)準(zhǔn)化組織還在 IOS10646-2000 的第二平面擴(kuò)展了42,711漢字(又稱為 CJK-擴(kuò)展 b)。該42,711 漢字的編碼表已基本確定,盡管不排除未來(lái)微小變動(dòng)的可能性。也就是說(shuō),到目前為止 Unicode已編碼的漢字達(dá)七萬(wàn)多字。CJK-擴(kuò)展 b
國(guó)際標(biāo)準(zhǔn)化組織還在 IOS10646-2000 的第二平面擴(kuò)展了42,711漢字(又稱為 CJK-擴(kuò)展 b)CJK-擴(kuò)展 b 的42,711漢字編排在 IOS10646-2000的第二平面,所以編碼需要4個(gè)字節(jié)。為存取處理這些4字節(jié)字符,在 Unicode 中引入了 surrogate 機(jī)制(在 IOS10646-2000中命名為 UTF-16)。根據(jù)這樣一種機(jī)制, 在 Unicode中用兩個(gè)16位編碼就可以對(duì) IOS10646-2000 第二平面中的漢字進(jìn)行存取。Microsoft 從 windows2000 (在 windows 98, Windows Me 及 Windows Nt4 中沒(méi)有)開(kāi)始對(duì)這樣一種機(jī)制提供支持。只要有相應(yīng)的輸入法和字庫(kù)并且在應(yīng)用程序中給予相應(yīng)的支持,就應(yīng)該能夠輸入顯示上述提到的漢字。但是,要想得到對(duì) surrogate全面的支持,用戶需先下載并安裝 surrogate Package ( Surrogate支持包 )。
支持 CJK-擴(kuò)展 b漢字顯示的字體:
簡(jiǎn)體中文版 Microsoft Office Xp及更高版本附帶了宋體-超大字符集中文字體 ,支持上面提到的全部27,564個(gè)漢字以及在第二平面中(42,711)選出的36,862個(gè)在中國(guó)大陸、香港特別行政區(qū)(以及部分臺(tái)灣地區(qū))使用的漢字。因此包括西文等常用字符在內(nèi),宋體-方正超大字符集共包括65,531個(gè)字符。換言之,它支持 CJK-擴(kuò)展 a中的全部漢字和 CJK-擴(kuò)展 b中的部分漢字。
繁體中文版 Microsoft Office Xp及更高版本則提供了支持超大字符集的細(xì)明體(Mingliu Ext-B 與 Pmingliu Ext-B),可以從已裝有 office的電腦中單獨(dú)找到該字體文件,復(fù)制到本機(jī) windows系統(tǒng)下的 fonts文件夾中即可。需要注意的是,此字體全面支持 CJK-擴(kuò)展 b中的42711字,但不支持 CJK-擴(kuò)展 a中的6582字。
海峰五筆 Unicode超大字符集字體支持包:完美結(jié)合了大陸與港臺(tái)的數(shù)種主流字體,支持 GBK、GB-18030、CJK-B各大字符集內(nèi)全部簡(jiǎn)、繁體漢字的顯示, 通用于 windows 98/Nt/2000/Me/Xp/2003系統(tǒng)。安裝此包之后,用宋體即可顯示任何漢字。
GB13000.1國(guó)家標(biāo)準(zhǔn) ——《CJK 統(tǒng)一漢字編碼字符集》即GBK(“國(guó)家標(biāo)準(zhǔn)擴(kuò)展”的拼音縮寫(xiě))
1993年國(guó)家標(biāo)準(zhǔn) GB13000.1 是完全等同于國(guó)際標(biāo)準(zhǔn) IOS10646.1,國(guó)際標(biāo)準(zhǔn)化組織為了將世界各民族的文字進(jìn)行統(tǒng)一編碼,制定了 ucs標(biāo)準(zhǔn)。根據(jù)這一標(biāo)準(zhǔn),中、日、韓三國(guó)共同制定了《CJK統(tǒng)一漢字編碼字符集》,其國(guó)際標(biāo)準(zhǔn)號(hào)為:IOS/Iec10646,國(guó)家標(biāo)準(zhǔn)號(hào)為:GB13000-90,該漢字編碼字符集就是通常人們所說(shuō)的大字符集,它編入了20902個(gè)漢字,收集了大陸一二級(jí)字庫(kù)中的簡(jiǎn)體字,臺(tái)灣《通用漢字標(biāo)準(zhǔn)交換碼》中的繁體字,58個(gè)香港特別用字和92個(gè)延邊地區(qū)朝鮮族“吏讀”字,甚至涵蓋了日文與韓文中的通用漢字,滿足了方方面面的需要。Windows95/98/Nt/2000中都裝入了大字符集漢字庫(kù),人們一般稱它為 GBK(“國(guó)家標(biāo)準(zhǔn)擴(kuò)展”的拼音縮寫(xiě))。
漢字?jǐn)U展內(nèi)碼規(guī)范--GBK的目的是解決漢字收字不足、簡(jiǎn)繁同平面共存、簡(jiǎn)化代碼體系間轉(zhuǎn)換等漢字信息交換的瓶頸問(wèn)題,并在保持已有應(yīng)用軟件兼容性的前提下,向最終的國(guó)際統(tǒng)一雙字節(jié)字符集標(biāo)準(zhǔn) IOS10646.1 邁進(jìn)。
擴(kuò)展的漢字內(nèi)碼規(guī)范的原則
與 《信息交換用漢字編碼字符集--基本集》即國(guó)家標(biāo)準(zhǔn) 的內(nèi)碼體系標(biāo)準(zhǔn)完全兼容。在字匯一級(jí)支持 IOS 10466.1/《CJK統(tǒng)一漢字編碼字符集》即國(guó)家標(biāo)準(zhǔn) 的全部 ?漢字。非漢字符號(hào)同時(shí)涵蓋大部分常用的 非漢字符號(hào)。規(guī)范的名稱與簡(jiǎn)稱
中文名稱:漢字內(nèi)碼規(guī)范
英文名稱:Chinese Internal Code Specification
簡(jiǎn)稱: GBK ( K 是“擴(kuò)展”的漢語(yǔ)拼音第一個(gè)字母)規(guī)范的內(nèi)容適用范圍
作為非 Ucs (IOS 10646) 體系的代碼頁(yè)(Code Page),適用于中文信息的處理、交換、存儲(chǔ)、顯現(xiàn)、輸入和輸出。
GB18030-2000國(guó)家標(biāo)準(zhǔn) ——《信息交換用漢字編碼字符集基本集的擴(kuò)充》2000年
2000年3月,國(guó)家信息產(chǎn)業(yè)部和質(zhì)量技術(shù)監(jiān)督局在北京聯(lián)合發(fā)布了《信息技術(shù)和信息交換用漢字編碼字符集、基本集的擴(kuò)充》,國(guó)家標(biāo)準(zhǔn)號(hào)為:GB18030-2000,收錄了27000多個(gè)漢字,還收錄了藏、蒙、維等主要少數(shù)民族的文字,該標(biāo)準(zhǔn)于2000年12月31日強(qiáng)制執(zhí)行。 Gb 18030-2000 作為 GBK For Unicode 3.0 的更新而誕生,并且 作為 GB2312-1980《信息交換用漢字編碼字符集 基本集》的擴(kuò)展,向下兼容
GB18030 編碼是一二四字節(jié)變長(zhǎng)編碼:一字節(jié)部分從 0x0~0x7f 與 ASCII 編碼兼容。二字節(jié)部分, 首字節(jié)從 0x81~0xfe, 尾字節(jié)從0x40~0x7e 以及0x80~0xfe,與 GBK標(biāo)準(zhǔn)基本兼容。四字節(jié)部分, 第一字節(jié)從 0x81~0xfe, 第二字節(jié)從 0x30~0x39, 第三和第四字節(jié)的范圍和前兩個(gè)字節(jié)分別相同。四字節(jié)部分覆蓋了從 0x0080 開(kāi)始, 除去二字節(jié)部分已經(jīng)覆蓋的所有 Unicode3.0碼位。也就是說(shuō), GB18030 編碼在碼位空間上做到了與 Unicode 標(biāo)準(zhǔn)一一對(duì)應(yīng),GB18030是我國(guó)繼 GB2312-1980和 GB13000-1993之后最重要的漢字編碼標(biāo)準(zhǔn),是未來(lái)我國(guó)計(jì)算機(jī)系統(tǒng)必須遵循的基礎(chǔ)性標(biāo)準(zhǔn)之一。
Base64
有的電子郵件系統(tǒng)(比如國(guó)外信箱)不支持非英文字母(比如漢字)傳輸,
Base64編碼
這是歷史原因造成的(認(rèn)為只有美國(guó)會(huì)使用電子郵件?)。因?yàn)橐粋€(gè)英文字母使用 ASCII編碼來(lái)存儲(chǔ),占存儲(chǔ)器的1個(gè)字節(jié)(8位),實(shí)際上只用了7位2進(jìn)制來(lái)存儲(chǔ),第一位并沒(méi)有使用,設(shè)置為0,所以,這樣的系統(tǒng)認(rèn)為凡是第一位是1的字節(jié)都是錯(cuò)誤的。而有的編碼方案(比如 GB2312)不但使用多個(gè)字節(jié)編碼一個(gè)字符,并且第一位經(jīng)常是1,于是郵件系統(tǒng)就把1換成0,這樣收到郵件的人就會(huì)發(fā)現(xiàn)郵件亂碼。
為了能讓郵件系統(tǒng)正常的收發(fā)信件,就需要把由其他編碼存儲(chǔ)的符號(hào)轉(zhuǎn)換成 ASCII碼來(lái)傳輸。比如,在一端發(fā)送 GB2312編碼->根據(jù) Base64規(guī)則->轉(zhuǎn)換成 ASCII碼,接收端收到 ASCII碼->根據(jù) Base64規(guī)則->還原到 GB2312編碼。