I18N就是Internationalization(該單詞的首字母I與尾字母N中間隔著18個字符)。它是一個代碼修改的過程,目的是實現代碼完全獨立于任何特定的文化信息。這類信息保存在外部文件里,在程序運行的時候被裝入。有些人可能想,只要把程序中所有特定文化有關的字符串(hard-coded strings)都抽取出來放在外部的文件中,就已為國際化做好準備了。其實,除了這個,還有一些事情需要考慮,主要包括:
選擇編碼頁(code page),如果需要并定義編碼頁轉換
修改所有的文本處理函數,以適應代碼頁的引入
修改所有與格式化輸出有關的函數(如日期、時間、貨幣、數值等)的實現邏輯
修改整理/排除函數的實現邏輯
什么是編碼頁(code page)?
正如我們所知,計算機只懂得數值。因此,當我們想要它處理文本時,就把一門語言中每個字符都賦以特定的值。簡單地說來,這種字符與數值的對照表就叫編碼頁。在這種情況下,你可能常會聽到諸如字符集(charset),字符表(charmap),編碼(encoding),編碼字符集(coded character set)等術語。雖然彼此間還有一些細微的差異,為理解的目的你可以認為它們都是指每種語言的字符、數值映射表。ASCII編碼頁就是一個很著名的例子,它把英文字母表和一些控制字符映射到一些特定的數值上去。
還有哪些編碼頁?圍繞著編碼頁有哪些問題?
ASCII編碼映射了127個字符,因此7位(bit)二進制數足夠用來表示127個字符。程序則典型地在8位的緩沖區內處理文本。這在處理其它的語言的編碼頁是會出問題。例如日語這種語言,有成千讓萬個字符,8位二制只能表示256個不同的字符,不可能唯一地表示每一個日語字符。因此,人們用幾個字節來表示一個日語字符,F在,我們又遇到另一個問題。緩沖區的字節數不等于緩沖區中的字符數。每一個簡單地字符串操作,都需要將字節組裝成字符。
認識到這種復雜性,開發人員利用一種叫寬字符(wide-character)的技術來處理外語字符串。寬字符基本上是16位或32位的數據類型。容量夠大,能滿足亞洲語言的需求。處理字符串不再使用8位的緩沖區(char *),而是使用16位的緩沖(unsigned short *)。因此每次移動指針,你都可以保證跳過了一個字符(而不是原先那可能是半個)。
不同的開發商使用不同的編碼頁,給這帶來了混亂。也就是說,同一個日語字符,在一個機器上可能用0x95和0x5c兩個字節表示,而在另外的機器的上則可能是0xc9和0xbd。這樣一事每次交換數據都要進行一次轉換(稱為碼表轉換(charmap conversion)或碼集轉換(codeset conversion))。
每一種語言的不同的編碼頁,增加了那些需要支持不同語言的軟件的復雜度。因而人們制定了一個世界標準,叫做unicode(http://www.unicode.org).Unicode為每個字符提供了唯一的特定數值,不論在什么平臺上、不論在什么軟件中,也不論什么語言。也就是說,它世界上使用的所有字符都列出來,并給每一個字符一個唯一特定數值。
Unicode的最初目標,是用1個16位的編碼來為超過65000字符提供映射。但這還不夠,它不能覆蓋全部歷史上的文字,也不能解決傳輸的問題(implantation head-ache's),尤其在那些基于網絡的應用中。已有的軟件必須做大量的工作來程序16位的數據。
因此,Unicode用一些基本的保留字符制定了三套編碼方式。它們分別是UTF-8,UTF-16和UTF-32。正如名字所示,在UTF-8中,字符是以8位序列來編碼的,用一個或幾個字節來表示一個字符。這種方式的最大好處,是UTF-8保留了ASCII字符的編碼做為它的一部分,例如,在UTF-8和ASCII中,“A”的編碼都是0x41.
UTF-16和UTF-32分別是Unicode的16位和32位編碼方式?紤]到最初的目的,通常說的Unicode就是指UTF-16。在討論Unicode時,搞清楚哪種編碼方式非常重要。Unicdoe相關的技術介紹參見http://www.unicode.org/unicode/standard/principles.html.
特定文化有關的字符串(hard-coded strings),程序中不能包含與特定文化有關的任何字符串,這類串都要放在外部文件中,從而能譯成多種語言。
字符分類(character classification) 如何對字符進行分類呢?例如,英文中可以將字符分為大寫字符和小寫字符,如果你是個C程序員,則可以用isupper()和islower()來檢查。當面臨多種語言時,需要考慮更多分類方法,有時候大小寫分類法在某些語言中沒有任何意義。
數值和貨幣格式 貨幣符號,以及將數值中數位分組的方式,每個國家各不相同。
日期和時間格式 年、月、日哪個寫在最前面?
整理/排序 如果比較字符”A”和“B”,你可以實際比較它們的ASCII值來決定它們的順序。但是,在不同的編碼頁可能并不如此。因此必須用特殊的規則來決定字符順序。
文章來源于領測軟件測試網 http://www.kjueaiud.com/