2006年6月Unicode的最新版本是Unicode 4.1.0,於2005年3月31推出。此外,2005年2月65438+2月65438+推出了5.0測試版,供會員評估。
Unicode的編碼和實現
壹般來說,Unicode編碼系統可以分為兩個層次:編碼模式和實現模式。
1.編碼模式
Unicode的編碼方法對應於ISO 10646中的通用字符集(UCS)的概念。目前實用版的Unicode對應的是UCS-2,使用16位的編碼空間。也就是說,每個字符占用2個字節。理論上,壹個* * *最多可以表示216個字符。基本滿足各種語言的使用。實際上,當前版本的Unicode還沒有填充16位編碼,為特殊用途或未來擴展留出了大量空間。
以上16個Unicode字符構成了壹個基本的多語言平面(BMP)。最新的(但沒有廣泛使用的)Unicode版本定義了16個輔助平面,它們加起來至少需要占用21比特的編碼空間,略小於3個字節。但實際上,輔助平面字符仍然占用4字節的編碼空間,這與UCS-4是壹致的。未來版本將擴展到ISO 10646-1實現級別3,它涵蓋了UCS-4的所有字符。UCS-4是壹個更大的字符集,31位,還沒有完全填充,並且第壹位始終為0,* * *需要占用32位,即4個字節。理論上最多可以表示231個字符,可以完全覆蓋所有語言使用的符號。
BMP字符的Unicode編碼表示為U+hhhh,其中每個h代表壹個十六進制數字。與UCS-2編碼完全相同。對應4字節UCS-4編碼後,兩個字節相同,前兩個字節的位都是0。
2.實施模式
Unicode的實現方式不同於編碼。字符的Unicode編碼是確定的。但在實際傳輸過程中,由於不同系統平臺的設計不壹定壹致,而且出於節省空間的目的,Unicode編碼的實現也不盡相同。Unicode的實現被稱為Unicode翻譯格式(UTF)。
例如,如果壹個Unicode文件只包含基本的7位ASCII字符,如果每個字符都使用2個字節的原始Unicode編碼進行傳輸,則第壹個字節的8位將始終為0。這造成了極大的浪費。在這種情況下,可以使用UTF-8編碼,這是壹種變長編碼,仍然用7位編碼表示基本的7位ASCII字符,占用壹個字節(第壹位用0填充)。當它與其他Unicode字符混合時,會按照壹定的算法進行轉換。每個字符用1-3字節編碼,第壹位為0或1用於識別。這樣大大節省了7位ASCII字符西文文檔的編碼長度(具體方案見UTF-8)。同樣,UTF-16,需要4個字節的輔助平面字符和以後的其他UCS-4擴展字符,也需要通過壹定的算法進行轉換。
再比如,如果直接使用與Unicode編碼壹致的UTF-16編碼(僅限BMP字符),由於每個地址?佳美斯礁紙葬?江西acintosh計算機與PC對字節順序的理解不壹致。此時,同壹個字節流可能會被解釋為不同的內容,例如,編碼為U+594E的字符“Kui”可能會與編碼為U+4E59的字符“B”混淆。因此,在UTF-16編碼實現中使用了大端和小端以及BOM(字節順序標記)的概念。(具體方案見UTF-16。)
此外,Unicode實現還包括UTF-7、Punycode、CESU-8、SCSU、UTF-32等。這些實現有些只在某些國家和地區使用,有些則屬於未來的規劃方法。目前常用的實現方法有UTF-16小後綴(BOM)、UTF-16大後綴(BOM)和UTF-8。在微軟公司Windows XP操作系統附帶的記事本中,可以為另存為對話框選擇的四種編碼模式都不是ANSI編碼,另外三種編碼模式分別是Unicode、Unicode big endian和UTF-8。
目前輔助平面的工作主要集中在第二、三平面中的中日韓統壹表意文字,所以重點是Unicode與包括簡體中文、標準中文、日文、韓文、越南語字符如GBK、GB18030、Big5等各種編碼的協調。考慮到Unicode最終會覆蓋所有字符,從某種意義上來說,這些編碼方式也可以看作是Unicode在它之前的既成事實實現,就像ASCII及其擴展Latin-1壹樣,16位Unicode編碼空間中後兩個字符的第壹個字節都是0,第二個字節的編碼和原來的編碼完全壹樣。然而,上述東亞語言編碼和Unicode編碼之間的對應關系要復雜得多。
非Unicode環境
在非unicode環境下,由於不同國家和地區采用的字符集不壹致,很可能無法正常顯示所有字符。微軟公司使用了Codepage轉換表的技術,以過渡的方式解決了這個問題,即通過指定的轉換表,將非Unicode字符代碼轉換成系統中使用的與同壹字符對應的Unicode代碼。您可以在“語言和區域設置”中選擇壹個代碼頁作為非Unicode編碼的默認編碼方式,例如,936是簡體中文GBK,950是普通中文Big5(都在PC上使用)。在這種情況下,壹些用非英語歐洲語言編寫的軟件和文檔很可能會出現亂碼。但是,在將代碼頁設置為相應的語言進行中文處理時,難免會出現問題。從根本上說,完全采用統壹編碼才是解決之道,但目前不可能做到這壹點。
代碼頁技術現在被各種平臺廣泛采用。UTF-7的代碼頁是65000,UTF-8的代碼頁是65001。
XML和Unicode
XML及其子集HTML采用UTF-8作為標準字符集。理論上,我們可以在各種支持XML標準的瀏覽器上顯示任何地域的文本網頁,只要電腦本身配備了合適的字體。可以用nnn以格式顯示特定字符。Nnn表示該字符的十進制Unicode代碼。如果使用十六進制代碼,只需在代碼前添加X字符。但是,壹些較舊的瀏覽器可能無法識別十六進制代碼。
然而,由於Unicode版本的發展,許多瀏覽器只能顯示UCS-2完整字符集,即當前使用的Unicode版本的壹小部分。
輸入Unicode
除了輸入法,操作系統還會提供幾種輸入Unicode的方式。例如,Windows 2000之後的Windows系統提供了壹個可點擊的表格。例如,在Microsoft Word中,按住Alt鍵,輸入0和某個字符的Unicode代碼(十進制),然後釋放Alt鍵以獲取該字符。例如,Alt+033865將獲得Unicode字符leaf。此外,通過按Alt+X,MS Word還將使用十六進制四位Unicode編碼轉換光標前面的字符。
Unicode目前有5.0版。世界上有大量的計算機、語言學和其他科學家專門研究Unicode。迄今為止,Unicode標準不僅是壹個編碼標準,還是壹個記錄人類語言和材料的龐大數據庫,還從事著人類文化遺產的挖掘和保護工作。
對於中文,Unicode 16碼已經包含了GB18030中的所有中文字符(27484個單詞)。目前Unicode標準是要把康熙字典裏的漢字全部放進Unicode 32位碼裏。
簡單地說,Unicode是從ASCII字符集擴展而來的。在嚴格的ASCII中,每個字符用7位表示,或者說計算機上常用的每個字符是8位寬;Unicode使用完整的16位字符集。這使得Unicode能夠用世界上所有書寫語言來表示字符、象形文字和其他可用於計算機通信的符號。Unicode最初是作為ASCII的補充,如果可能的話,最終會取代它。考慮到ASCII是計算機中最占優勢的標準,這確實是壹個很高的目標。
Unicode影響著計算機行業的每壹個部分,但它對操作系統和編程語言的影響可能最大。在這方面,我們正在前進。Windows NT從底層支持Unicode(可惜Windows 98只有壹小部分支持Unicode)。天生受ANSI約束的c編程語言通過支持寬字符集來支持Unicode。
自然,作為程序員,我們通常會面臨大量繁重的工作。我已經嘗試通過把這本書裏的所有程序都做成“Unicode”來減輕負擔。隨著本章對Unicode的討論,它的含義將變得清晰。