什么是Unicode 歷史上,有兩個獨立的,創(chuàng)立單一字符集的嘗試.一個是國際標(biāo)準(zhǔn)化組織(ISO)的ISO10646項目,另一個是由(一開始大多是美國的)多語言軟件制造商組成的協(xié)會組織的Unicode項目.幸運的是,1991年前后,兩個項目的參與者都認(rèn)識到,世界不需要兩個不同的單一字符集.它們合并雙方的工作成果,并為創(chuàng)立一個單一編碼表而協(xié)同工作.兩個項目仍都存在并獨立地公布各自的標(biāo)準(zhǔn),但Unicode協(xié)會和ISO/IECJTC1/SC2都同意保持Unicode和ISO10646標(biāo)準(zhǔn)的碼表兼容,并緊密地共同調(diào)整任何未來的擴(kuò)展.UnicodevsISO10646Unicode協(xié)會公布的Unicode標(biāo)準(zhǔn)嚴(yán)密地包含了ISO10646-1實現(xiàn)級別3的基本多語言面.在兩個標(biāo)準(zhǔn)里所有的字符都在相同的位置并且有相同的名字.Unicode標(biāo)準(zhǔn)額外定義了許多與字符有關(guān)的語義符號學(xué),一般而言是對于實現(xiàn)高質(zhì)量的印刷出版系統(tǒng)的更好的參考.Unicode詳細(xì)說明了繪制某些語言(比如阿拉伯語)表達(dá)形式的算法,處理雙向文字(比如拉丁與希伯來文混合文字)的算法和排序與字符串比較所需的算法,以及其他許多東西.另一方面,ISO10646標(biāo)準(zhǔn),就象廣為人知的ISO8859標(biāo)準(zhǔn)一樣,只不過是一個簡單的字符集表.它指定了一些與標(biāo)準(zhǔn)有關(guān)的術(shù)語,定義了一些編碼的別名,并包括了規(guī)范說明,指定了怎樣使用UCS連接其他ISO標(biāo)準(zhǔn)的實現(xiàn),比如ISO6429和ISO2022.還有一些與ISO緊密相關(guān)的,比如ISO14651是關(guān)于UCS字符串排序的.考慮到Unicode標(biāo)準(zhǔn)有一個易記的名字,且在任何好的書店里的Addison-Wesley里有,只花費ISO版本的一小部分,且包括的輔助信息,因而它成為使用廣泛得多的參考也就不足為奇了.然而,一般認(rèn)為,用于打印ISO10646-1標(biāo)準(zhǔn)的字體在某些方面的質(zhì)量要高于用于打印Unicode2.0的.專業(yè)字體設(shè)計者總是被建議說要兩個標(biāo)準(zhǔn)都實現(xiàn),但一些提供的樣例字形有顯著的區(qū)別.ISO10646-1標(biāo)準(zhǔn)同樣使用四種不同的風(fēng)格變體來顯示表意文字如中文,日文和韓文(CJK),而Unicode2.0的表里只有中文的變體.這導(dǎo)致了普遍的認(rèn)為Unicode對日本用戶來說是不可接收的傳說,盡管是錯誤的.UTF-8首先UCS和Unicode只是分配整數(shù)給字符的編碼表.現(xiàn)在存在好幾種將一串字符表示為一串字節(jié)的方法.最顯而易見的兩種方法是將Unicode文本存儲為2個或4個字節(jié)序列的串.這兩種方法的正式名稱分別為UCS-2和UCS-4.除非另外指定,否則大多數(shù)的字節(jié)都是這樣的(Bigendianconvention).將一個ASCII或Latin-1的文件轉(zhuǎn)換成UCS-2只需簡單地在每個ASCII字節(jié)前插入0x00.如果要轉(zhuǎn)換成UCS-4,則必須在每個ASCII字節(jié)前插入三個0x00.在Unix下使用UCS-2(或UCS-4)會導(dǎo)致非常嚴(yán)重的問題.用這些編碼的字符串會包含一些特殊的字符,比如'\\0'或'/',它們在文件名和其他C庫函數(shù)參數(shù)里都有特別的含義.另外,大多數(shù)使用ASCII文件的UNIX下的工具,如果不進(jìn)行重大修改是無法讀取16位的字符的.基于這些原因,在文件名,文本文件,環(huán)境變量等地方,UCS-2不適合作為Unicode的外部編碼.在ISO10646-1AnnexR和RFC2279里定義的UTF-8編碼沒有這些問題.它是在Unix風(fēng)格的操作系統(tǒng)下使用Unicode的明顯的方法.UTF-8有一下特性:UCS字符U+0000到U+007F(ASCII)被編碼為字節(jié)0x00到0x7F(ASCII兼容).這意味著只包含7位ASCII字符的文件在ASCII和UTF-8兩種編碼方式下是一樣的.所有>U+007F的UCS字符被編碼為一個多個字節(jié)的串,每個字節(jié)都有標(biāo)記位集.因此,ASCII字節(jié)(0x00-0x7F)不可能作為任何其他字符的一部分.表示非ASCII字符的多字節(jié)串的第一個字節(jié)總是在0xC0到0xFD的范圍里,并指出這個字符包含多少個字節(jié).多字節(jié)串的其余字節(jié)都在0x80到0xBF范圍里.這使得重新同步非常容易,并使編碼無國界,且很少受丟失字節(jié)的影響.可以編入所有可能的231個UCS代碼UTF-8編碼字符理論上可以最多到6個字節(jié)長,然而16位BMP字符最多只用到3字節(jié)長.BigendianUCS-4字節(jié)串的排列順序是預(yù)定的.字節(jié)0xFE和0xFF在UTF-8編碼中從未用到.下列字節(jié)串用來表示一個字符.用到哪個串取決于該字符在Unicode中的序號.U-00000000-U-0000007F:0xxxxxxxU-00000080-U-000007FF:110xxxxx10xxxxxxU-00000800-U-0000FFFF:1110xxxx10xxxxxx10xxxxxxU-00010000-U-001FFFFF:11110xxx10xxxxxx10xxxxxx10xxxxxxU-00200000-U-03FFFFFF:111110xx10xxxxxx10xxxxxx10xxxxxx10xxxxxxU-04000000-U-7FFFFFFF:1111110x10xxxxxx10xxxxxx10xxxxxx10xxxxxx10xxxxxxxxx的位置由字符編碼數(shù)的二進(jìn)制表示的位填入.越靠右的x具有越少的特殊意義.只用最短的那個足夠表達(dá)一個字符編碼數(shù)的多字節(jié)串.注意在多字節(jié)串中,第一個字節(jié)的開頭\"1\"的數(shù)目就是整個串中字節(jié)的數(shù)目.例如:Unicode字符U+00A9=10101001(版權(quán)符號)在UTF-8里的編碼為:1100001010101001=0xC20xA9而字符U+2260=0010001001100000(不等于)編碼為:111000101000100110100000=0xE20x890xA0這種編碼的官方名字拼寫為UTF-8,其中UTF代表UCSTransformationFormat.請勿在任何文檔中用其他名字(比如utf8或UTF_8)來表示UTF-8,當(dāng)然除非你指的是一個變量名而不是這種編碼本身.