歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> ICU4C 介紹: C/C++ 平台強大的國際化應用開發組件

ICU4C 介紹: C/C++ 平台強大的國際化應用開發組件

日期:2017/2/27 15:46:07   编辑:Linux教程
隨著全球經濟快速一體化,信息的國際化成為了當前熱門的話題,但是,必須認識到的是,信息國際化也是個比較復雜的課題,國際化中需要做到的不僅僅是對多語言字符集的支持,還需要能夠解決由於地區文化差異造成的例如時間,數字表示,貨幣表示,字符串操作等各類國際化中存在的問題。相對於 JAVA 國際化支持能力,C/C++ 平台的國際化能力就較顯不足,C/C++ 平台亟需一個強大的國際化應用開發組件來方便軟件的國際化開發,在本篇文章中,我們將討論國際化中存在的問題,介紹 C++ 平台強大的國際化應用開發組件 ICU4C,並且重點討論 ICU4C 的特性。

軟件國際化
軟件國際化(I18N)是指開發不經過系統性的改變,就能直接支持指定的多個地區文化的軟件的軟件開發過程。軟件國際化對編碼和設計都要求嚴格,代碼和設計都必須考慮到各種國家和地區文化差別,軟件國際化的目標是開發的軟件能適合所有指定人群的使用。由於軟件開發者常常會做一些他們自己地區習慣的假設,而這些假設都可能導致發布的軟件不能對某一地區文化正確支持,成功的軟件國際化開發過程關鍵在於在設計和編碼階段都需要避免所有文化相關的假設,將程序的執行代碼和UI相關的元素分開。

國際化過程中需要關注的包括以下幾個方面:

時間和日期的表示
時間的表示由很多因素決定的,這些因素包括年和月的長短,一星期中的哪一天是一個星期的開始,時區差別,是否實施夏令時等等。舉例來說,某一時刻在中國北京(GMT+8)的時間表示是 2005年10月10日 星期一 15時54分,這個時刻在倫敦(GMT+0)的時間則應該是October 10, 2005 8:54 AM,對於這個結果,首先注意到的是兩地表示時間的方式完全不一樣,我們不能期望英國的用戶能夠看懂中文表示的時間,或者中國的用戶都能接受英語形式的時間表示,可見地區文化的差異造成了時間在表現方式上的區別。同時,我們注意到除了時間的表現方式,兩地時間還存在七個小時的偏差,這是因為時區造成了兩地八小時的偏差,加上倫敦采用夏令時制度,使得兩地實際時間偏差就變成了8-1=7小時。

時間和日期的表示中這些問題的存在,使得軟件國際化過程中要求不僅僅關注時間值的表現形式,還需要關注如日歷制度,夏令時,時區等能造成時間值差別的因素。

數字的表示
數字的表示方式並不是唯一的,不同國家和地區數字表示方式也存在著區別,因此在軟件國際化過程中,不能假設本地的數字表現方式也是其他地區用戶可以認可的。影響數字表現的因素包括數字字符的表示、數字符號的表示、數字的類型等。舉例來說數字一千二百三十四點五七(1234.57)在英語中的表示是1,234.57,而在德語中的表示為1.234,57,印度語中表示如清單1,從這個例子中可以看到不同語言中不僅僅存在單個數字的表示方式區別(如印度語種數字和和其他語言數字有明顯區別),小數點和千位分隔符等數字符號表示也存在著巨大的區別。

國際化中,軟件內的數字必須根據國家和地區語言和文化上的區別,數字類型(如貨幣,百分率等)的區別,進行恰當的轉換。

清單1


貨幣的表示
應用程序中會出現貨幣相關的操作,貨幣表示非常重要,是國際化開發中不能被忽視的問題。影響貨幣表示的因素包括:匯率,貨幣數值小數的表示,貨幣使用的符號,貨幣符號的位置等。一個簡單的例子來說明貨幣表示中存在的問題,在今年3月時候, 1美元可以兌換131.17日元,但是用戶永遠也不可能兌換到131.17日元,這是因為日元中最小的面額就是1日元,日元 (JPY) 通常是不帶任何小數位顯示的。從這個例子中可以看到,貨幣兌換過程中有兌換匯率的影響,轉換到目標貨幣下的貨幣數值需要根據貨幣實際情況轉換表現形式。

國際化中需要考慮影響貨幣數值表現的各個因素,根據依據目標群體的貨幣政策和國家文化,恰當地表現貨幣數值。

度量單位
度量單位直接關系到數值的實際表示結果,雖然,度量單位存在著國際標准,但由於歷史,風俗習慣等原因,很多地區及國家並不唯一使用國際標准,因此,度量單位也是國際化中需要考慮的問題。例如說,美國同時存在著國際通用標准制和英制兩種度量制度,英制是相對更常用的度量制度,英制中的長度可以使用英寸 (inch)來表示,而國際通用標准是米和分米等; 對於重量的表示,英制使用磅(pound), 而國際標准是克與千克。軟件國際化中,當存在度量習慣區別時,軟件中度量相關的數據都需要根據度量單位進行合適的轉換。

字符排序
即使不同的語言具有相同的字母表都可能具有不同的字母排序順序,字母字符的排序在各個地區都有個約定成俗的標准。並不是所有語言都把某一個字母的大小寫形式看成是等價的,重音的區別,某個符號出現與否,甚至拼寫不一致性 都可能導致看似等價的兩個字符串實際上的不等價。字符的排序是需要根據不同地域文化確定的。
字符編碼集區別

軟件中表示文字或者語言中的符號的方式是賦予每一個文字和符號一個獨一無二數字值,這樣的一個從字符和符號到數字的映射集合便被稱為字符編碼集。

由於歷史的原因,字符集的開發開始都是獨立的,導致的結果是,不同國家和地區都可能具有不同的字符集,各種字符編碼集也可能是不相兼容的。字符集的差別影響到包括文本的輸入、輸出格式、存儲及排序等涉及到字符操作的多個部分。軟件國際化的目標是所有字符集相關內容都能得到合適的操作,這就要求軟件不僅僅能夠支持目標字符集,還要支持不同字符集之間的字符轉換。

ASCII(美國信息互換標准代碼)是最常見的字符集,它基於羅馬字母表的一套電腦編碼系統,主要用於顯示現代英語和其他西歐語言,是現今最通用的單字節編碼系統。而像中文和日文,這兩種語言都擁有遠遠超過256個字符,就必須使用1個或多個字符來表示一個字符,中國台灣使用的是和大陸不同的字符集,稱為Big5,同一個漢字對應的編碼不同,便造成了中國海峽兩岸計算機文檔及各種軟件交流時候的亂碼問題。

Unicode是一種在計算機上使用的字符編碼,它為每種語言中的每個字符設定了統一並且唯一的二進制編碼,以滿足跨語言、跨平台進行文本轉換、處理的要求。Unicode不僅僅提供了對於任何語言的完善的文字支持, 而且提供了一個全面的數學與技術符號集,因此,Unicode作為取代所有其他編碼方式的優秀字符集,將成為文字編碼的主流,應用在所有具有文字編碼的地方。

軟件的國際化過程最合適的方法就是使用Unicode作為軟件內部文本的字符集,圍繞Unicode字符集,進行字符串排序,輸出等文本操作。對於國際化應用的開發組件,Unicode的支持必不可少,作為基於Unicode的國際化開發組件,ICU4C通過對Unicode完善的支持給軟件提供了強大的國際化能力。

文本的輸入和呈現
軟件國際化開發時候不能對文本的輸入和呈現有任何假設,包括每個字符占多大的空間,文字呈現的方向,或者呈現屏幕從哪裡開始;也不要假設按鍵次數是和字符一對一的。例如,阿拉伯人和希伯來人的閱讀習慣是從右向左,文本輸入也是從右向左,這樣的習慣被稱為BIDI(Bidirectionality)。BIDI是國際化中重要內容,使用到BIDI的地方必須額外的注意,BIDI的特點包括:

(1) 本土語言(阿拉伯和希伯來語等) 寫的方向為從右往左

(2) 數字和非本土語言(如英語,法語) 寫的方向為從左往右

(3) 文本呈現方向整體來說是從右往左,例 清單2
清單2, BIDI UI


什麼是ICU4C
ICU4C是ICU在C/C++平台下的版本, ICU(International Component for Unicode)是基於"IBM公共許可證"的,與開源組織合作研究的, 用於支持軟件國際化的開源項目。ICU4C提供了C/C++平台強大的國際化開發能力,軟件開發者幾乎可以使用ICU4C解決任何國際化的問題,根據各地的風俗和語言習慣,實現對數字、貨幣、時間、日期、和消息的格式化、解析,對字符串進行大小寫轉換、整理、搜索和排序等功能,必須一提的是,ICU4C提供了強大的BIDI算法,對阿拉伯語等BIDI語言提供了完善的支持。

ICU首先是由Taligent公司開發的,Taligent公司現在被合並為IBM?公司全球化認證中心的Unicode研究組,然後ICU由IBM和開源組織合作繼續開發,開源組織給與了ICU極大的幫助。

開始ICU只有Java平台的版本,後來這個平台下的ICU類被吸納入SUN公司開發的JDK1.1,並在JDK以後的版本中不斷改進。C++和C平台下的ICU是由JAVA平台下的ICU移植過來的,移植過的版本被稱為ICU4C,來支持這C/C++兩個平台下的國際化應用。

ICU4C和ICU4C區別不大,但由於ICU4C是開源的,並且緊密跟進Unicode標准,ICU4C支持的Unicode標准總是最新的;同時,因為JAVA平台的ICU4J的發布需要和JDK綁定,ICU4C支持Unicode標准改變的速度要比ICU4J快的多。

ICU4C的特性
ICU4C有效地增強了C/C++平台的軟件國際化能力,它使得開發者可以寫出獨立於風俗和語言的C/C++代碼,然後這些代碼可以通過利用相關資源組成語言和風俗相關軟件。ICU4C除了具有對Unicode強大的支持能力以外,針對國際化中的各種問題,ICU4C提供了強大的國際化問題解決能力,ICU4C國際化的特性包括:

170+種 Locale支持
雖然Unicode給文本提供了統一的表示方法,但是除了文本表示,各種各樣的地域和文化區別仍然存在於不同的系統中。軟件國際化推薦的方式是在軟件內部使用語言/文化獨立的數據,再根據目標平台的語言/文化規則來為目標平台格式化這些數據。

在文章前面的內容中,我們不斷提到區域語言,文化和習慣這樣一個概念,Locale就是這個概念的概括,它標識了一個特定的用戶群體, 這個群體中的用戶對於人和計算機交互有著相近的文化和語言。和Locale相關聯的數據就是前述的那些目標平台相關的規則,這些規則給日期、數字、貨幣格式化,度量單位轉換,字符串整理(排序),時區轉換,邊界分析(字符,字符串,句子),文本標准化以及音譯等國際化操作提供了支持。

Locale的廣泛支持是國際化開發包的重要條件,支持的Locale種類越多,說明開發出來的應用程序適用的范圍越廣,ICU4C作為C/C++平台強大的國際化開發組件,提供了超過170種Locale的支持。

ICU中的Locale ID和POSIX定義的Locale ID 是不同的,ICU中的Locale ID被認為是輕量級,因為它區別於POSIX的定義,沒有指定Locale相關的字符編碼,並且細化具有某些區別的類似群體成為不同的Locale。ICU4C中的Locale是由語言(language),可選的語言編碼(script),國家(country),可選的變量(variable)和可選的關鍵字(keyword) 這幾個域組成,可選的域可以被用於根據特定區別細化Locale。ICU中的Locale ID組成格式在清單3中:

清單3
locale_id := 基本LocaleID 關鍵字
基本LocaleID := language_code ("_" script_code)? ("_" _code)? ("_" variant_code)?
關鍵字:= "@" key "=" type ("," key "=" type )*

用戶使用Locale ID 來請求Locale相關的ICU服務。除了Locale相關服務以外,ICU4C其他部分也使用Locale 作為定制行為依據的ID。例如ICU中時間日期轉換的服務是Locale相關的,它根據目標Locale的信息來轉換時間日期,如果Locale是en_US(美國),一個星期的第一天會被表示成"Monday",而如果Locale 是zh_CN(中國),一個星期的第一天也應該被表示成"星期一"。

ICU4C的API(C++)使用類Locale來表示Locale,這個類提供了查詢語言,國家和變量的方法;在基於C的API中,Locale 則被定義為簡單的字符串。
Resource Bundle的實現

Resource Bundle是國際化中重要的數據查詢機制,它的實現原理是將Locale相關的數據和程序代碼分離,將數據和數據的表現采用 "鍵-翻譯"形式映射。這樣做的好處包括:
(1) 程序代碼中不會出現 和Locale相關的數據,程序員不需要了解或者使用目標Locale相關的語言數據。
(2) 需要翻譯的數據可以直接拿給了解目標平台語言的專業人員翻譯,而不需要提供代碼。
(3) 數據統一集中,使得數據的管理更加方便。

ICU4C中提供了Resource Bundle的實現,並且ICU4C中的Resource Bundle功能更加強大,ICU4C中Resource Bundle的特性包括:

多樣的數據類型支持:ICU4C中的Resource Bundle支持多種數據類型,包括:字符串,二進制文件(圖片,文件等),數值,數組(Array),表(Table),甚至到其他資源的鏈接。字符串,二進制文件(圖片,文件等),數值被稱為簡單數據類型;表(Table)和數組(Array)都是數據的集合,表儲存具有名字的數據,數組儲存沒有名字的數據。

多樣的數據查詢方法:ICU4C提供了多種方法來查詢Resource Bundle中的數據:表(Table)可以通過鍵(key),索引(index)和迭代 (iteration) 方式訪問;數組(Array)可以通過索引 (index)或者迭代 (iteration) 方式來訪問;字符串,二進制文件及數值這幾種簡單數據類型則可以通過鍵(key) 來訪問。

優秀的數據回調機制:ICU4C的資源管理框架提供了優秀的數據回調機制。這個機制保證了當查詢的數據資源不存在的情況下,ICU4C能自動找到相對最恰當的數據。回調通常會發生在以下兩種情況:

[1] 當某個Locale的資源文件被請求的時候,如果這個Locale相對的目標資源文件不存在,ICU4C的資源管理框架會自動回調,並且按照一定順序查找更加適合的資源文件。例如,當請求Locale "zh_CN"相對應的資源文件時候,沒有找到這樣的資源文件,ICU4C會自動回調查找 Locale"zh"對應的資源文件,如果這個資源文件存在,將會返回這個資源文件;如果"zh"對應的資源文件還不存在,ICU4C將進一步回調。

[2] 當某個資源文件內部的數據找不到的時候,ICU4C會在相對通用的資源文件中查找。 例如,某一次數據查詢,某一個資源數據沒有能在Locale "en_IE_EURO"的資源文件中找到,繼而ICU4C會去"en_IE"相對的資源文件中去查找相應的數據。

和XLIFF格式相互轉換:XLIFF(XML Localisation Interchange File Format)本地化交換文件格式,XLIFF 是XML的一種應用,是用來在與翻譯項目的各方之間交換本地化數據的格式,可以被用來作為中間文件格式來翻譯多語言文檔。ICU4C提供的工具可以將已有的Resource Bundle 轉換為XLIFF格式,或者將已有的XLIFF格式文件轉換成ICU4C的Resource Bundle資源文件。

Resource Bundle相關的ICU4C API中,C++ 平台下最重要的類是 ResourceBundle,這個類包含了和一系列特定Locale相關的資源信息,另外,程序員通過類的構造函數來打開相關Locale相對的資源文件。C語言相關的重要函數包括:ures_open用來打開對應Locale下的資源,ures_getByKey通過關鍵字方式查詢,ures_getByIndex通過索引查詢,ures_getNextResource通過迭代方式查詢,ures_close關閉打開的Resource Bundle。

時間日期轉換服務
正如第一章所述,時間的表示是由很多因素決定的,國際化過程中,軟件內部的時間必須根據目標Locale和目標時區進行巧當轉換之後呈現出來。ICU4C提供了完善的時間日期轉換支持,用戶可以通過使用ICU4C做到:

(1) 根據不同時區轉換時間表示。
(2) 解析時間字符串到ICU4C內部表示; 被解析的時間格式可以是任意的,因為ICU支持定制解析規則。
(3) 根據目標Locale,指定的格式,時區來格式化時間表示。
(4) 操作時間(如兩個時間之間的比較,獲得當前時間增加一天後的時間表示等)

ICU4C的時間日期轉換服務提供了豐富的API來支持這些功能,以C++平台下API為例,其中最重要的幾個類包括:

UDate:UDate用來存放ICU4C時間的內部表示,每個UDate是個 double類型的值,存放從GMT時間1970年1月1日24:00開始到被表示時刻經過的毫秒數;UDate表示的是時刻的概念,是個Locale,Time Zone 無關的概念,我們發現JAVA中的Date類同ICU4C種的UDate有類似的含義。

DateFormat:ICU4C提供了抽象類DateFormat來實現時間的格式化和解析操作,用戶可以使用這個類來格式化時間和日期的內部表示或者用來解析已有的語言相關的時間/日期形式轉換為內部表示。

Calendar:使用Calendar類可以實現時間在ICU4C的內部表示和"年月日"形式的相互轉換。用戶還可以使用這個類來實現時間相關的各種操作,如計算將已有時間基礎上加兩天時間的結果

TimeZone:TimeZone類是用來表示時區的抽象類,除了表示時區的偏移,TimeZone類還加入了夏令時的支持。Calendar需要設置TimeZone來生成目標時區的時間表示。

SimpleDateFormat: SimpleDateFormat是以語言獨立的方式格式化,解析及標准化時間的具體類。用戶可以使用SimpleDateFormat將UDate格式化成文本,或者將時間表示的文本轉換成UDate形式。用戶還可以使用這個類應用自定義的模式(Pattern)來定制解析或者格式化的規則。

數字,貨幣的格式化
數字在程序的內部表示是二進制形式的, 但是,將內部表示的數字呈現出來的時候還需要額外的注意。不僅僅是不同Locale影響數字表現方式,數字的類型也影響數字的表示。數字需要根據數字的類型以及目標的Locale進行格式化。

ICU4C提供了完善的數字、貨幣格式化能力,它支持多種類型的數字,包括西部數字,印度數字,和阿拉伯數字;同時,它還支持數字的多種形式,包括科學表達式如"1.23E4",百分率表達式如"12%",貨幣表達式如"$123"等。使用ICU4C,用戶可以做到:
(1) 根據特定Locale格式化數字內部表示到呈現表示。
(2) 將軟件中的貨幣數字轉換為特定Locale下的貨幣表示(包括貨幣特征的數字表示和貨幣符號)。
(3) 控制數字的顯示。
(4) 以類似於函數printf對數字的格式化。

ICU4C的數字,貨幣格式化服務的API(C++)中最重要的類包括:

NumberFormat:NumberFormat是個抽象類,它可以被用來根據某個Locale的實現對數字的格式化或者完成表示數字的字符串的解析,用戶還可以使用NumberFormat來確定數字的類型,如百分率或者貨幣數字等;NumberFormat可以根據設置的類型輸出數字格式化後的結果。

DemicalFormat:類DemicalFormat繼承於NumberFormat,是用於十進制數字操作的類,程序員可以使用NumberFormat的createInstance方法獲取DemicalFormat的實例;DemicalFormat包括了一系列的可以定制的符號(Symbol)和可以定制的模式(Pattern),符號和模式共同組成了數字格式化和解析的規則。

RuleBasedNumberFormat:RuleBasedNumberFormat也是NumberFormat的子類,它一般被用來將數字轉換成拼寫形式,如將數字25,3476 拼寫成 "twenty-five thousand three hundred seventy-six",還可以被使用來將數字轉換為時間表示等。同樣,RuleBasedNumberFormat中的規則可以被定制來顯示程序員想要的結果。

字符集的支持
由於軟件平台對Unicode支持程度的區別,即使使用Unicode作為軟件字符集,軟件國際化過程中也經常會遇到非Unicode字符集支持的要求,文本常常需要在Unicode和非Unicode字符集中相互轉換。ICU4C的強大在於它提供了500多種字符集的支持,並且有效的解決了字符集相關的問題,用戶可以使用ICU4C做到:

(1) 快速有效地完成單個字符或者字符串,或者字符流在不同編碼集中的轉換(包括Unicode和其他字符集的相互轉換等)。

(2) 面向不同平台的字符轉換結果保持一致。存在著這樣的情況,同一個字符集,不同平台下的某些字符的編碼也會不同,這會導致字符從一個平台切換到另一個平台下時存在數據丟失問題,ICU4C提供了有效機制保證了轉換結果的一致性。

(3) 檢測未知格式數據的字符編碼方式。

(4) 在ICU4C中定制添加新的字符集支持。

(5) 可以為傳輸和存儲需要壓縮Unicode文本

字符集轉換主要依靠API中提供的函數實現,這些函數被歸納在"ucnv.h"頭文件中,其中最重要的幾個函數包括:

ucnv_open: 用於打開轉換服務的函數,參數為目標字符集的名字,函數返回對應目標字符集的converter(轉換服務);函數返回的converter可以作為參數傳入其他函數做目標字符集相關的實際轉換工作。

ucnv_fromUChars:ucnv_open返回的converter會作為參數傳入這個函數,標示了目標字符集的類型。這個函數是將Unicode字符集下的字符串轉換為目標字符集下的字符串。

ucnv_toUChars:同ucnv_fromUChars,區別在於ucnv_fromUChars將Unicode字符集下的字符串轉換成其他指定的字符集字符串,ucnv_toUChars將指定的非Unicode字符集字符串轉換為Unicode字符串。

ucnv_getNextUChar:同理,ucnv_open返回的converter會作為參數傳入這個函數,標示目標字符集的類型。這個函數將使用Unicode編碼的源字符串一個的一個字符轉換到目標字符集下。函數每被調用一次,只有一個Unicode字符將會轉換,同時指示被轉換字符的指針往後移一個Unicode字符。

ucnv_close:ucnv_open返回的converter會作為參數傳入這個函數,作為函數操作的對象,這個函數關閉了由ucnv_open打開的converter(轉換服務)。

消息的格式化
消息是一系列字符串,數字和日期數據的組合,軟件常常需要輸出些動態消息,國際化中如何讓這些消息以正確合理的語言格式顯示是個問題。ICU4C提供了格式化消息的功能,用戶可以使用ICU4C做到:

(1) 不需要給每種Message都提供對應Locale的版本,只需要定制字符串,數字,日期的排列模式,通過應用Resource Bundle 獲取某些字符串的確切翻譯,就可以在指定Locale 下獲得正確合理的消息文本。

(2) 可以通過用戶定義的模式(Pattern)來解析已有的字符串。

(3) 本地化工作者也同樣可以修改消息的內容,消息格式以及文本的排列順序。

ICU4C消息格式化的API(C++)有兩個重要的類,分別是MessageFormat和ChoiceFormat,下面是對這兩個類的解釋:

MessageFormat: ICU4C使用MessageFormat類來組成針對終端客戶的符合語言邏輯的消息,它將消息組成的元素(包括字符串,數字,日期等)按照用戶指定的模式組合起來。通過和Resource Bundle合作,用戶可以利用MessageFormat獲得在任意指定Locale下任意格式的合乎語言邏輯的消息輸出。

ChoiceFormat: ChoiceFormat是繼承於NumberFormat的類,可以用作MessageFormat的補充。通過ChoiceFormat類可以支持復數,數字范圍等。
字符串處理

使用Unicode字符集作為軟件字符串內部字符集並不能避免字符串處理的問題,使用ICU4C,用戶可以實現以下的字符串操作:

(1) 大小寫映射:大小寫映射是用來處理語言中存在的字母大小寫及字母的標題表示的問題。即使是使用相同的字母表,不同Locale同一字母的大(小)寫或者標題表示卻可能不同。ICU4C給大小寫映射提供了強大的支持,ICU4C支持3種方式的字母操作,分別是:常規字母映射;語言相關的字母映射;字母大小寫表示(大寫,小寫,標題表示)擦除。

(2) 標准化:轉換已有的文本到一個同一等價形式的過程被稱為標准化。標准化後的文本可以方便搜索,查詢等進一步的字符串操作。ICU4C提供了Normalizer類實現了字符串的標准化操作,Normalizer類可以看成兩個部分,它一方面用於標准化字符串及測試目標字符串是否已經被標准化的靜態方法;另一方面,它還可以作為任何類型文本的標准化形式的迭代器 (iterator)。

(3) 音譯:音譯是字符串從一種語言到另一種語言的轉換中比較通用的一種方式,音譯不同於翻譯,它使用目標語言給出源語言字符串的音譯,而並不對字符串進行意義上的翻譯。例如清單4是日語到拉丁語的音譯。
清單4 音譯


(4) 字符串整理
用戶常常期望能看到經過合理排序後的字符串,因為經過合理排序的字符串更便於有效查找期望的數據。但是"排序"的概念對於不同語言是不同的;即使使用相同字母集的語言,"排序"的概念也可能不同;即使在同一語言中,不同用途的文檔中字符串的"排序"概念也會不同。

"排序"概念的區別引起國際化中字符串整理的問題,ICU4C實現了和UCA(Unicode Collation Algorithm)全面兼容的Unicode字符串整理服務,它給用戶需要的各種Locale都提供了適合的字符串排序方法。

ICU4C的字符串整理服務提供了兩部分的內容:字符串的比較及字符串"比較鍵"的生成。字符串的"比較鍵"是從原Unicode字符串中計算出來的,代表原被計算Unicode字符串的,由 '\0' 結束的字符串,它可以直接被用於標准C中的strcmp, memcmp 等函數來比較原字符串。ICU4C的API(C++平台)中提供了Collator類來實現Unicode字符串的整理功能。

(5) 邊界檢查
應用程序在處理文本的時候常常會遇到文本邊界的問題,字符串的邊界檢查是指確定文本的邊界,文本的邊界包括字母分界,字分界,句子的分界及段落的分界。

不同Locale定義的分界有區別,軟件國際化中不能以本地Locale來假設文本的邊界。 ICU4C提供了API(C++)BreakIterator類來實現Unicode字符串的邊界檢查。

結束語
在本篇文章中,我們討論了國際化中常見的問題,介紹了C/C++平台國際化開發組件ICU4C,並且概要介紹了ICU4C的特性和強大的國際化支持能力。可以看到ICU4C的強大,在於它對國際化的支持是廣泛而且深入的,用戶幾乎可以使用ICU4C解決任何C/C++平台下軟件國際化的問題。後面的文章將更加詳細地描述ICU4C這個強大的國際化開發組件。
原文:http://www.ibm.com/developerworks/cn/opensource/os-icu4c/
Copyright © Linux教程網 All Rights Reserved