I18N和L10N深度探險

I18N和L10N深度探險

預備知識:

無論是I18N還是L10N,從技術角度簡單地說,其本質上都是字符編碼的問題。
  http://www.infomall.cn/cgi-bin/mallgate/20040514/http://www.i18nfaq.com/以FAQ的形式,對I18N和L10N做一些解釋,並提供了一些工具,對遇到字符編碼難題的朋友,也許會有一些價值。下面是對網站一些文章的學習筆記。

三個概念

I18N :即internationalization,軟件國際化。一個過程,通過修改代碼實現代碼的文化獨立性,即代碼不依賴於任何特定文化的信息(cultural specific information)。

L10N :即localization,軟件本地化。一個過程,爲每一種支持的人類語言來定製軟件。

Code Page :即所謂代碼頁,它是一個字符和數值進行映射的表。


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

二.
什麼是locale?

I18N的主要目標,是將所有與特定文化有關的信息從代碼抽取出來。這也就意味着,你需要在運行時要裝載這些數據,因而你的軟件能夠在那種語言中正常運行。在開發人員的語言中,一個locale不過是一個這種動態加載的數據的句柄(handle)。基於這種技術,locale有幾個組件,基本的組件有語言、地域和編碼頁。
什麼是“code page”?爲什麼需要它?

由於一種語言可有多個編碼頁(如日語,有EUC、Shift-JIS、UTF-8等編碼頁),有時在兩個系統間交換數據時必須做編碼頁轉換。另一種情況是,當你在一個分佈式系統上工作時且決定用Unicode編碼頁保存數據時,在進行顯示時必須轉換成本地的編碼;或者當你收到用戶的輸入等。編碼頁轉換通常是一個查表操作,非常耗費資源。只有很少的編碼頁轉換,如UTF-16到UTF-8提供了轉換算法。
什麼是轉換敏感的編碼頁shift sensitive codepages?

在一些亞洲語言的編碼中,一些特殊的字節序列,是用來區分單字節字符和雙字節字符的。例如,在日語ISO-2022-JP編碼頁中,字節序列/x1B/x24/x40用來表示從單字節字符進入雙字節字符,而字節序列/x1B/x28/x42則用來表示從雙字節字符到單字節字符。換句話說,在分析一個字符串時,如果你遇到了字節序列/x1B/x24/x40,則你知道從此以後的將是一些雙字節字符。用以標誌從單字節字符轉到雙字節字符的字節序列叫做shift-in序列,另一個則叫shift-out序列。這些轉換點對解析字符串提出了挑戰,因爲你要一直保存着當前的狀態,以便進行相關的字符器操作。ISO-2022-JP 和 ISO-2022-KR 是兩個非常著名的日語和韓語轉換敏感編碼頁,流行於很多的HTML頁面中。
什麼是EBCDIC編碼頁?
  
EBCDIC這個編碼頁的缺點是,即使英文字符也不與ASCII值一致。這兒有EBCDIC和ASCII的對照表。 
關於亞洲字符集有什麼好的參考書供初學者?

Ken Lunde的CJKV Information Processing.
什麼是國際化QA(internationalization QA)?

就是那些特別關注產品的語言兼容性測試的QA。這包括測試產品在其語言環境中識別和初始化語言處理的行爲、適應那個環境的能力。白盒測試應當典型地包括檢查那此實現I18N兼容性標準的代碼(如使用正確實的API等)。黑盒測試應典型地包括在不同的語言環境中產品全部功能的迴歸測試以及測試界面上的本地化語言的字符串。特定文化信息也需要檢查(如日期、時間顯示等)。
什麼是本地化QA(localization QA)?

本地化QA在軟件本地化/翻譯完這後進行。重點不僅包括功能,而且包括GUI上下文中的信息的翻譯是否適宜。還包括檢查GUI佈局,確保沒有信息被截斷等。它通常由以某種語言爲母語的人來測試。
我只懂英文,也能做國際化QA嗎 ? 

當然可以。QA中i18n的那部分,不需要特定語言的任何知識,雖然懂得這種語言遲早會用上排場,尤其是進行環境語言設置的時候。如果你作i18nQA,你的產品還沒有進行翻譯,則它的界面仍以英文顯示。也可能有一些來自己運行環境的錯誤信息你搞不清楚,但通常你可以據錯誤代碼到英文錯誤信息庫中查找相關內容。
在亞洲語言環境中,常有哪些問題會造成軟件運行的中斷?

許多的亞洲語言的編碼頁中,多字節字符的第二個字節在ASCII範圍內。這類字符易造成軟件的中斷。
如何將字符串從一種編碼轉換到其它編碼?

利用*nix環境中利用iconv命令,或下載jiconv。
如何看某一個字符的16進制編碼?

在*nix環境中利用od -x命令,在win環境下用hod.exe
什麼是jchardet?

jchardet是mozilla自動字符集探測算法代碼的java移植,其源代碼可以從sourceforge下載。這個算法的最初作者是frank Tang,C++源代碼在http://www.infomall.cn/cgi-bin/mallgate/20040514/http://lxr.mozilla.org/mozilla/source/intl/chardet/,可以從http://www.infomall.cn/cgi-bin/mallgate/20040514/http://www.mozilla.org/projects/intl/chardet.html得到更多關於這個算法的信息。
    

三.

主要學習JCharDet,一個猜測字符串編碼集的程序包
什麼是jchardet?

jchardet是mozilla自動字符集探測算法代碼的java移植,其源代碼可以從sourceforge下載。這個算法的最初作者是frank Tang,C++源代碼在http://www.infomall.cn/cgi-bin/mallgate/20040514/http://lxr.mozilla.org/mozilla/source/intl/chardet/,可以從http://www.infomall.cn/cgi-bin/mallgate/20040514/http://www.mozilla.org/projects/intl/chardet.html得到更多關於這個算法的信息。
編譯及應用

  將下載後的chardet.zip解壓縮後,到~/mozilla/intl/chardet/java/目錄下,運行ant即可在dist/lib目錄下生成chardet.jar,將這個jar包加入CLASSPATH.然後 
運行:java org.mozilla.intl.chardet.HtmlCharsetDetector http://hedong.3322.org
結果:CHARSET = GB18030
運行:java org.mozilla.intl.chardet.HtmlCharsetDetector http://www.wesnapcity.com/ 
結果:CHARSET = ASCII
運行:java org.mozilla.intl.chardet.HtmlCharsetDetector http://www.wesnapcity.com/blog/ 
結果:CHARSET = UTF-8

編程使用

  下面就jchardet.jar中的HtmlCharsetDetector.java,對調用jchardet過程予以說明:
//實現nsICharsetDetectionObserver接口,這個接口只有一個Notify()方法.當jchardet引擎自己認爲已經識別出字符串的字符集後(不論識別的對錯),都會調用這個Notify方法。
nsICharsetDetectionObserver cdo=new nsICharsetDetectionObserver() {
  public void Notify(String charset) {
   HtmlCharsetDetector.found = true ;
   System.out.println("CHARSET = " + charset);
  }
};
/**
* 初始化nsDetector()
*lang爲一個整數,用以提示語言線索,可以提供的語言線索有以下幾個: 

1.    Japanese 
2.    Chinese 
3.    Simplified Chinese 
4.    Traditional Chinese 
5.    Korean 
6.    Dont know (默認)

*/
nsDetector det = new nsDetector(lang) ;
// 設置一個Oberver
det.Init(cdo);
BufferedInputStream imp = new BufferedInputStream(url.openStream());
byte[] buf = new byte[1024] ;
boolean done = false ;  //是否已經確定某種字符集
boolean isAscii = true ;//假定當前的串是ASCII編碼
while( (len=imp.read(buf,0,buf.length)) != -1) {
  // 檢查是不是全是ascii字符,當有一個字符不是ASC編碼時,則所有的數據即不是ASCII編碼了。
  if (isAscii) isAscii = det.isAscii(buf,len);
  // 如果不是ascii字符,則調用DoIt方法.
  if (!isAscii && !done) done = det.DoIt(buf,len, false);//如果不是ASCII,又還沒確定編碼集,則繼續檢測。
}
det.DataEnd();//最後要調用此方法,此時,Notify被調用。
if (isAscii) {
System.out.println("CHARSET = ASCII");
found = true ;
}
if (!found) {//如果沒找到,則找到最可能的那些字符集
String prob[] = det.getProbableCharsets() ;
for(int i=0; i
  System.out.println("Probable Charset = " + prob[i]);
}
}

jchardet主要解決什麼樣的問題?

  Java字符串(及字符)類以Unicode編碼保存數據。當處理來自外部的國際性文本時,我們需要提供關於這些文本的編碼,以便準確地將它們轉換爲Unicode。這意味着你必須知道你的java代碼要處理的所有文件的編碼。許多基於Internet的Java應用程序,要處理來自隨機數據源的數據,而很多數據的編碼不能確切的知道。例如,一個HTML頁面中的數據,如果沒有元數據標籤明確地指定頁面的字符集,就很難確實其編碼,將其轉換爲Java Unicode字符串時也會誤用而終止。 
這個算法是如何工作的?

  瀏覽器處理這個問題的方法,是對數據一個字節一個字節的檢查,以力圖測試字符集(當你點擊菜單View->Auto-select或auto-detect時)。這個算法(最初由Frank Tang開發)檢查字節序列,基於每個字節的值,利用逐步消除法(elimination logic)逐步縮小以至最後確定字符集。如果這個方法仍難以確定,就利用另一個方法,根據某種語言的字符的頻次統計來確實字符集。


四.

iconv和jiconv都可以將文本信息的從一種編碼轉換爲另一種。
iconv是*nix上的一個工具程序。其基本格式是: 
iconv -f encoding -t encoding inputfile
iconv能認識的字字符集有 
437, 500, 500V1, 850, 851, 852, 855, 856, 857, 860, 861, 862, 863, 864, 865, 866, 869, 874, 904, 1026, 1046, 1047, 8859_1, 8859_2, 8859_3, 8859_4, 8859_5, 8859_6, 8859_7, 8859_8, 8859_9, 10646-1:1993, 10646-1:1993/UCS4, ANSI_X3.4-1968, ANSI_X3.4-1986, ANSI_X3.4, ANSI_X3.110-1983, ANSI_X3.110, ARABIC, ARABIC7, ASCII, ASMO-708, ASMO_449, BALTIC, BIG-5, BIG-FIVE, BIG5-HKSCS, BIG5, BIG5HKSCS, BIGFIVE, BS_4730, CA, CN-BIG5, CN-GB, CN, CP-AR, CP-GR, CP-HU, CP037, CP038, CP273, CP274, CP275, CP278, CP280, CP281, CP282, CP284, CP285, CP290, CP297, CP367, CP420, CP423, CP424, CP437, CP500, CP737, CP775, CP813, CP819, CP850, CP851, CP852, CP855, CP856, CP857, CP860, CP861, CP862, CP863, CP864, CP865, CP866, CP868, CP869, CP870, CP871, CP874, CP875, CP880, CP891, CP903, CP904, CP905, CP912, CP915, CP916, CP918, CP920, CP922, CP930, CP932, CP933, CP935, CP936, CP937, CP939, CP949, CP950, CP1004, CP1026, CP1046, CP1047, CP1070, CP1079, CP1081, CP1084, CP1089, CP1124, CP1129, CP1250, CP1251, CP1252, CP1253, CP1254, CP1255, CP1256, CP1257, CP1258, CP1361, CP10007, CPIBM861, CSA7-1, CSA7-2, CSASCII, CSA_T500-1983, CSA_T500, CSA_Z243.4-1985-1, CSA_Z243.4-1985-2, CSA_Z243.419851, CSA_Z243.419852, CSDECMCS, CSEBCDICATDE, CSEBCDICATDEA, CSEBCDICCAFR, CSEBCDICDKNO, CSEBCDICDKNOA, CSEBCDICES, CSEBCDICESA, CSEBCDICESS, CSEBCDICFISE, CSEBCDICFISEA, CSEBCDICFR, CSEBCDICIT, CSEBCDICPT, CSEBCDICUK, CSEBCDICUS, CSEUCKR, CSEUCPKDFMTJAPANESE, CSGB2312, CSHPROMAN8, CSIBM037, CSIBM038, CSIBM273, CSIBM274, CSIBM275, CSIBM277, CSIBM278, CSIBM280, CSIBM281, CSIBM284, CSIBM285, CSIBM290, CSIBM297, CSIBM420, CSIBM423, CSIBM424, CSIBM500, CSIBM851, CSIBM855, CSIBM856, CSIBM857, CSIBM860, CSIBM863, CSIBM864, CSIBM865, CSIBM866, CSIBM868, CSIBM869, CSIBM870, CSIBM871, CSIBM880, CSIBM891, CSIBM903, CSIBM904, CSIBM905, CSIBM918, CSIBM922, CSIBM930, CSIBM932, CSIBM933, CSIBM935, CSIBM937, CSIBM939, CSIBM943, CSIBM1026, CSIBM1124, CSIBM1129, CSISO4UNITEDKINGDOM, CSISO10SWEDISH, CSISO11SWEDISHFORNAMES, CSISO14JISC6220RO, CSISO15ITALIAN, CSISO16PORTUGESE, CSISO17SPANISH, CSISO18GREEK7OLD, CSISO19LATINGREEK, CSISO21GERMAN, CSISO25FRENCH, CSISO27LATINGREEK1, CSISO49INIS, CSISO50INIS8, CSISO51INISCYRILLIC, CSISO58GB1988, CSISO60DANISHNORWEGIAN, CSISO60NORWEGIAN1, CSISO61NORWEGIAN2, CSISO69FRENCH, CSISO84PORTUGUESE2, CSISO85SPANISH2, CSISO86HUNGARIAN, CSISO88GREEK7, CSISO89ASMO449, CSISO90, CSISO92JISC62991984B, CSISO99NAPLPS, CSISO103T618BIT, CSISO111ECMACYRILLIC, CSISO121CANADIAN1, CSISO122CANADIAN2, CSISO139CSN369103, CSISO141JUSIB1002, CSISO143IECP271, CSISO150, CSISO150GREEKCCITT, CSISO151CUBA, CSISO153GOST1976874, CSISO646DANISH, CSISO2022CN, CSISO2022JP, CSISO2022JP2, CSISO2022KR, CSISO2033, CSISO5427CYRILLIC, CSISO5427CYRILLIC1981, CSISO5428GREEK, CSISO10367BOX, CSISOLATIN1, CSISOLATIN2, CSISOLATIN3, CSISOLATIN4, CSISOLATIN5, CSISOLATIN6, CSISOLATINARABIC, CSISOLATINCYRILLIC, CSISOLATINGREEK, CSISOLATINHEBREW, CSKOI8R, CSKSC5636, CSMACINTOSH, CSNATSDANO, CSNATSSEFI, CSN_369103, CSPC8CODEPAGE437, CSPC775BALTIC, CSPC850MULTILINGUAL, CSPC862LATINHEBREW, CSPCP852, CSSHIFTJIS, CSUCS4, CSUNICODE, CUBA, CWI-2, CWI, CYRILLIC, DE, DEC-MCS, DEC, DECMCS, DIN_66003, DK, DS2089, DS_2089, E13B, EBCDIC-AT-DE-A, EBCDIC-AT-DE, EBCDIC-BE, EBCDIC-BR, EBCDIC-CA-FR, EBCDIC-CP-AR1, EBCDIC-CP-AR2, EBCDIC-CP-BE, EBCDIC-CP-CA, EBCDIC-CP-CH, EBCDIC-CP-DK, EBCDIC-CP-ES, EBCDIC-CP-FI, EBCDIC-CP-FR, EBCDIC-CP-GB, EBCDIC-CP-GR, EBCDIC-CP-HE, EBCDIC-CP-IS, EBCDIC-CP-IT, EBCDIC-CP-NL, EBCDIC-CP-NO, EBCDIC-CP-ROECE, EBCDIC-CP-SE, EBCDIC-CP-TR, EBCDIC-CP-US, EBCDIC-CP-WT, EBCDIC-CP-YU, EBCDIC-CYRILLIC, EBCDIC-DK-NO-A, EBCDIC-DK-NO, EBCDIC-ES-A, EBCDIC-ES-S, EBCDIC-ES, EBCDIC-FI-SE-A, EBCDIC-FI-SE, EBCDIC-FR, EBCDIC-GREEK, EBCDIC-INT, EBCDIC-INT1, EBCDIC-IS-FRISS, EBCDIC-IT, EBCDIC-JP-E, EBCDIC-JP-KANA, EBCDIC-PT, EBCDIC-UK, EBCDIC-US, EBCDICATDE, EBCDICATDEA, EBCDICCAFR, EBCDICDKNO, EBCDICDKNOA, EBCDICES, EBCDICESA, EBCDICESS, EBCDICFISE, EBCDICFISEA, EBCDICFR, EBCDICISFRISS, EBCDICIT, EBCDICPT, EBCDICUK, EBCDICUS, ECMA-114, ECMA-118, ECMA-128, ECMA-CYRILLIC, ECMACYRILLIC, ELOT_928, ES, ES2, EUC-CN, EUC-JP, EUC-KR, EUC-TW, EUCCN, EUCJP, EUCKR, EUCTW, FI, FR, GB, GB2312, GB13000, GB18030, GBK, GB_1988-80, GB_198880, GEORGIAN-ACADEMY, GEORGIAN-PS, GOST_19768-74, GOST_19768, GOST_1976874, GREEK-CCITT, GREEK, GREEK7-OLD, GREEK7, GREEK7OLD, GREEK8, GREEKCCITT, HEBREW, HP-ROMAN8, HPROMAN8, HU, IBM-856, IBM-922, IBM-930, IBM-932, IBM-933, IBM-935, IBM-937, IBM-939, IBM-943, IBM-1046, IBM-1124, IBM-1129, IBM037, IBM038, IBM256, IBM273, IBM274, IBM275, IBM277, IBM278, IBM280, IBM281, IBM284, IBM285, IBM290, IBM297, IBM367, IBM420, IBM423, IBM424, IBM437, IBM500, IBM775, IBM813, IBM819, IBM850, IBM851, IBM852, IBM855, IBM856, IBM857, IBM860, IBM861, IBM862, IBM863, IBM864, IBM865, IBM866, IBM868, IBM869, IBM870, IBM871, IBM874, IBM875, IBM880, IBM891, IBM903, IBM904, IBM905, IBM912, IBM915, IBM916, IBM918, IBM920, IBM922, IBM930, IBM932, IBM933, IBM935, IBM937, IBM939, IBM943, IBM1004, IBM1026, IBM1046, IBM1047, IBM1089, IBM1124, IBM1129, IEC_P27-1, IEC_P271, INIS-8, INIS-CYRILLIC, INIS, INIS8, INISCYRILLIC, ISIRI-3342, ISIRI3342, ISO-2022-CN-EXT, ISO-2022-CN, ISO-2022-JP-2, ISO-2022-JP, ISO-2022-KR, ISO-8859-1, ISO-8859-2, ISO-8859-3, ISO-8859-4, ISO-8859-5, ISO-8859-6, ISO-8859-7, ISO-8859-8, ISO-8859-9, ISO-8859-10, ISO-8859-11, ISO-8859-13, ISO-8859-14, ISO-8859-15, ISO-8859-16, ISO-10646, ISO-10646/UCS2, ISO-10646/UCS4, ISO-10646/UTF-8, ISO-10646/UTF8, ISO-CELTIC, ISO-IR-4, ISO-IR-6, ISO-IR-8-1, ISO-IR-9-1, ISO-IR-10, ISO-IR-11, ISO-IR-14, ISO-IR-15, ISO-IR-16, ISO-IR-17, ISO-IR-18, ISO-IR-19, ISO-IR-21, ISO-IR-25, ISO-IR-27, ISO-IR-37, ISO-IR-49, ISO-IR-50, ISO-IR-51, ISO-IR-54, ISO-IR-55, ISO-IR-57, ISO-IR-60, ISO-IR-61, ISO-IR-69, ISO-IR-84, ISO-IR-85, ISO-IR-86, ISO-IR-88, ISO-IR-89, ISO-IR-90, ISO-IR-92, ISO-IR-98, ISO-IR-99, ISO-IR-100, ISO-IR-101, ISO-IR-103, ISO-IR-109, ISO-IR-110, ISO-IR-111, ISO-IR-121, ISO-IR-122, ISO-IR-126, ISO-IR-127, ISO-IR-138, ISO-IR-139, ISO-IR-141, ISO-IR-143, ISO-IR-144, ISO-IR-148, ISO-IR-150, ISO-IR-151, ISO-IR-153, ISO-IR-155, ISO-IR-156, ISO-IR-157, ISO-IR-166, ISO-IR-179, ISO-IR-193, ISO-IR-197, ISO-IR-199, ISO-IR-203, ISO-IR-209, ISO-IR-226, ISO646-CA, ISO646-CA2, ISO646-CN, ISO646-CU, ISO646-DE, ISO646-DK, ISO646-ES, ISO646-ES2, ISO646-FI, ISO646-FR, ISO646-FR1, ISO646-GB, ISO646-HU, ISO646-IT, ISO646-JP-OCR-B, ISO646-JP, ISO646-KR, ISO646-NO, ISO646-NO2, ISO646-PT, ISO646-PT2, ISO646-SE, ISO646-SE2, ISO646-US, ISO646-YU, ISO2022CN, ISO2022CNEXT, ISO2022JP, ISO2022JP2, ISO2022KR, ISO6937, ISO8859-1, ISO8859-2, ISO8859-3, ISO8859-4, ISO8859-5, ISO8859-6, ISO8859-7, ISO8859-8, ISO8859-9, ISO8859-10, ISO8859-13, ISO8859-14, ISO8859-15, ISO8859-16, ISO88591, ISO88592, ISO88593, ISO88594, ISO88595, ISO88596, ISO88597, ISO88598, ISO88599, ISO885910, ISO885913, ISO885914, ISO885915, ISO885916, ISO_646.IRV:1991, ISO_2033-1983, ISO_2033, ISO_5427-EXT, ISO_5427, ISO_5427:1981, ISO_5427EXT, ISO_5428, ISO_5428:1980, ISO_6937-2, ISO_6937-2:1983, ISO_6937, ISO_6937:1992, ISO_8859-1, ISO_8859-1:1987, ISO_8859-2, ISO_8859-2:1987, ISO_8859-3, ISO_8859-3:1988, ISO_8859-4, ISO_8859-4:1988, ISO_8859-5, ISO_8859-5:1988, ISO_8859-6, ISO_8859-6:1987, ISO_8859-7, ISO_8859-7:1987, ISO_8859-8, ISO_8859-8:1988, ISO_8859-9, ISO_8859-9:1989, ISO_8859-10, ISO_8859-10:1992, ISO_8859-14, ISO_8859-14:1998, ISO_8859-15:1998, ISO_9036, ISO_10367-BOX, ISO_10367BOX, ISO_69372, IT, JIS_C6220-1969-RO, JIS_C6229-1984-B, JIS_C62201969RO, JIS_C62291984B, JOHAB, JP-OCR-B, JP, JS, JUS_I.B1.002, KOI-7, KOI-8, KOI8-R, KOI8-T, KOI8-U, KOI8, KOI8R, KOI8U, KSC5636, L1, L2, L3, L4, L5, L6, L7, L8, L10, LATIN-GREEK-1, LATIN-GREEK, LATIN1, LATIN2, LATIN3, LATIN4, LATIN5, LATIN6, LATIN7, LATIN8, LATIN10, LATINGREEK, LATINGREEK1, MAC-CYRILLIC, MAC-IS, MAC-SAMI, MAC-UK, MAC, MACCYRILLIC, MACINTOSH, MACIS, MACUK, MACUKRAINIAN, MS-ANSI, MS-ARAB, MS-CYRL, MS-EE, MS-GREEK, MS-HEBR, MS-MAC-CYRILLIC, MS-TURK, MSCP949, MSCP1361, MSMACCYRILLIC, MSZ_7795.3, MS_KANJI, NAPLPS, NATS-DANO, NATS-SEFI, NATSDANO, NATSSEFI, NC_NC0010, NC_NC00-10, NC_NC00-10:81, NF_Z_62-010, NF_Z_62-010_(1973), NF_Z_62-010_1973, NF_Z_62010, NF_Z_62010_1973, NO, NO2, NS_4551-1, NS_4551-2, NS_45511, NS_45512, OS2LATIN1, OSF00010001, OSF00010002, OSF00010003, OSF00010004, OSF00010005, OSF00010006, OSF00010007, OSF00010008, OSF00010009, OSF0001000A, OSF00010020, OSF00010100, OSF00010101, OSF00010102, OSF00010104, OSF00010105, OSF00010106, OSF00030010, OSF0004000A, OSF0005000A, OSF05010001, OSF100201A4, OSF100201A8, OSF100201B5, OSF100201F4, OSF100203B5, OSF1002011C, OSF1002011D, OSF1002035D, OSF1002035E, OSF1002035F, OSF1002036B, OSF1002037B, OSF10010001, OSF10020025, OSF10020111, OSF10020115, OSF10020116, OSF10020118, OSF10020122, OSF10020129, OSF10020352, OSF10020354, OSF10020357, OSF10020359, OSF10020360, OSF10020364, OSF10020365, OSF10020366, OSF10020367, OSF10020370, OSF10020387, OSF10020388, OSF10020396, OSF10020402, OSF10020417, PT, PT2, R8, ROMAN8, SE, SE2, SEN_850200_B, SEN_850200_C, SHIFT-JIS, SHIFT_JIS, SJIS, SS636127, ST_SEV_358-88, T.61-8BIT, T.61, T.618BIT, TIS-620, TIS620-0, TIS620.2529-1, TIS620.2533-0, TIS620, TS-5881, UCS-2, UCS-2BE, UCS-2LE, UCS-4, UCS-4BE, UCS-4LE, UCS2, UCS4, UHC, UJIS, UK, UNICODE, UNICODEBIG, UNICODELITTLE, US-ASCII, US, UTF-7, UTF-8, UTF-16, UTF-16BE, UTF-16LE, UTF-32, UTF-32BE, UTF-32LE, UTF7, UTF8, UTF16, UTF16BE, UTF16LE, UTF32, UTF32BE, UTF32LE, VISCII, WCHAR_T, WIN-SAMI-2, WINBALTRIM, WINDOWS-1250, WINDOWS-1251, WINDOWS-1252, WINDOWS-1253, WINDOWS-1254, WINDOWS-1255, WINDOWS-1256, WINDOWS-1257, WINDOWS-1258, WINSAMI2, WS2, YU
已知perl、php等語言,都有對這個iconv包裝接口。
  對Java語言,則更簡單,不需要外部的程序或包就可以實現。 
BufferedReader in = new BufferedReader( new InputStreamReader(System.in, fromEncoding));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out,toEncoding));
String str ;
while((str=in.readLine()) != null) {
out.write(str,0,str.length());
out.newLine();
out.flush();
}
java支持的字符集有:
Basic Encoding Set (contained in rt.jar)
Canonical Name     Description 
ASCII     American Standard Code for Information Interchange 
Cp1252     Windows Latin-1 
ISO8859_1     ISO 8859-1, Latin alphabet No. 1 
UnicodeBig     Sixteen-bit Unicode Transformation Format, big-endian byte order, with byte-order mark 
UnicodeBigUnmarked     Sixteen-bit Unicode Transformation Format, big-endian byte order 
UnicodeLittle     Sixteen-bit Unicode Transformation Format, little-endian byte order, with byte-order mark 
UnicodeLittleUnmarked     Sixteen-bit Unicode Transformation Format, little-endian byte order 
UTF8     Eight-bit Unicode Transformation Format 
UTF-16     Sixteen-bit Unicode Transformation Format, byte order specified by a mandatory initial byte-order mark 
Extended Encoding Set (contained in i18n.jar)
Canonical Name     Description 
Big5     Big5, Traditional Chinese 
Big5_HKSCS     Big5 with Hong Kong extensions, Traditional Chinese 
Cp037     USA, Canada (Bilingual, French), Netherlands, Portugal, Brazil, Australia 
Cp273     IBM Austria, Germany 
Cp277     IBM Denmark, Norway 
Cp278     IBM Finland, Sweden 
Cp280     IBM Italy 
Cp284     IBM Catalan/Spain, Spanish Latin America 
Cp285     IBM United Kingdom, Ireland 
Cp297     IBM France 
Cp420     IBM Arabic 
Cp424     IBM Hebrew 
Cp437     MS-DOS United States, Australia, New Zealand, South Africa 
Cp500     EBCDIC 500V1 
Cp737     PC Greek 
Cp775     PC Baltic 
Cp838     IBM Thailand extended SBCS 
Cp850     MS-DOS Latin-1 
Cp852     MS-DOS Latin-2 
Cp855     IBM Cyrillic 
Cp856     IBM Hebrew 
Cp857     IBM Turkish 
Cp858     Variant of Cp850 with Euro character 
Cp860     MS-DOS Portuguese 
Cp861     MS-DOS Icelandic 
Cp862     PC Hebrew 
Cp863     MS-DOS Canadian French 
Cp864     PC Arabic 
Cp865     MS-DOS Nordic 
Cp866     MS-DOS Russian 
Cp868     MS-DOS Pakistan 
Cp869     IBM Modern Greek 
Cp870     IBM Multilingual Latin-2 
Cp871     IBM Iceland 
Cp874     IBM Thai 
Cp875     IBM Greek 
Cp918     IBM Pakistan (Urdu) 
Cp921     IBM Latvia, Lithuania (AIX, DOS) 
Cp922     IBM Estonia (AIX, DOS) 
Cp930     Japanese Katakana-Kanji mixed with 4370 UDC, superset of 5026 
Cp933     Korean Mixed with 1880 UDC, superset of 5029 
Cp935     Simplified Chinese Host mixed with 1880 UDC, superset of 5031 
Cp937     Traditional Chinese Host miexed with 6204 UDC, superset of 5033 
Cp939     Japanese Latin Kanji mixed with 4370 UDC, superset of 5035 
Cp942     IBM OS/2 Japanese, superset of Cp932 
Cp942C     Variant of Cp942 
Cp943     IBM OS/2 Japanese, superset of Cp932 and Shift-JIS 
Cp943C     Variant of Cp943 
Cp948     OS/2 Chinese (Taiwan) superset of 938 
Cp949     PC Korean 
Cp949C     Variant of Cp949 
Cp950     PC Chinese (Hong Kong, Taiwan) 
Cp964     AIX Chinese (Taiwan) 
Cp970     AIX Korean 
Cp1006     IBM AIX Pakistan (Urdu) 
Cp1025     IBM Multilingual Cyrillic: Bulgaria, Bosnia, Herzegovinia, Macedonia (FYR) 
Cp1026     IBM Latin-5, Turkey 
Cp1046     IBM Arabic - Windows 
Cp1097     IBM Iran (Farsi)/Persian 
Cp1098     IBM Iran (Farsi)/Persian (PC) 
Cp1112     IBM Latvia, Lithuania 
Cp1122     IBM Estonia 
Cp1123     IBM Ukraine 
Cp1124     IBM AIX Ukraine 
Cp1140     Variant of Cp037 with Euro character 
Cp1141     Variant of Cp273 with Euro character 
Cp1142     Variant of Cp277 with Euro character 
Cp1143     Variant of Cp278 with Euro character 
Cp1144     Variant of Cp280 with Euro character 
Cp1145     Variant of Cp284 with Euro character 
Cp1146     Variant of Cp285 with Euro character 
Cp1147     Variant of Cp297 with Euro character 
Cp1148     Variant of Cp500 with Euro character 
Cp1149     Variant of Cp871 with Euro character 
Cp1250     Windows Eastern European 
Cp1251     Windows Cyrillic 
Cp1253     Windows Greek 
Cp1254     Windows Turkish 
Cp1255     Windows Hebrew 
Cp1256     Windows Arabic 
Cp1257     Windows Baltic 
Cp1258     Windows Vietnamese 
Cp1381     IBM OS/2, DOS People's Republic of China (PRC) 
Cp1383     IBM AIX People's Republic of China (PRC) 
Cp33722     IBM-eucJP - Japanese (superset of 5050) 
EUC_CN     GB2312, EUC encoding, Simplified Chinese 
EUC_JP     JIS X 0201, 0208, 0212, EUC encoding, Japanese 
EUC_JP_LINUX     JIS X 0201, 0208, EUC encoding, Japanese 
EUC_KR     KS C 5601, EUC encoding, Korean 
EUC_TW     CNS11643 (Plane 1-3), EUC encoding, Traditional Chinese 
GBK     GBK, Simplified Chinese 
ISO2022CN     ISO 2022 CN, Chinese (conversion to Unicode only) 
ISO2022CN_CNS     CNS 11643 in ISO 2022 CN form, Traditional Chinese (conversion from Unicode only) 
ISO2022CN_GB     GB 2312 in ISO 2022 CN form, Simplified Chinese (conversion from Unicode only) 
ISO2022JP     JIS X 0201, 0208 in ISO 2022 form, Japanese 
ISO2022KR     ISO 2022 KR, Korean 
ISO8859_2     ISO 8859-2, Latin alphabet No. 2 
ISO8859_3     ISO 8859-3, Latin alphabet No. 3 
ISO8859_4     ISO 8859-4, Latin alphabet No. 4 
ISO8859_5     ISO 8859-5, Latin/Cyrillic alphabet 
ISO8859_6     ISO 8859-6, Latin/Arabic alphabet 
ISO8859_7     ISO 8859-7, Latin/Greek alphabet 
ISO8859_8     ISO 8859-8, Latin/Hebrew alphabet 
ISO8859_9     ISO 8859-9, Latin alphabet No. 5 
ISO8859_13     ISO 8859-13, Latin alphabet No. 7 
ISO8859_15_FDIS     ISO 8859-15, Latin alphabet No. 9 
JIS0201     JIS X 0201, Japanese 
JIS0208     JIS X 0208, Japanese 
JIS0212     JIS X 0212, Japanese 
JISAutoDetect     Detects and converts from Shift-JIS, EUC-JP, ISO 2022 JP (conversion to Unicode only) 
Johab     Johab, Korean 
KOI8_R     KOI8-R, Russian 
MS874     Windows Thai 
MS932     Windows Japanese 
MS936     Windows Simplified Chinese 
MS949     Windows Korean 
MS950     Windows Traditional Chinese 
MacArabic     Macintosh Arabic 
MacCentralEurope     Macintosh Latin-2 
MacCroatian     Macintosh Croatian 
MacCyrillic     Macintosh Cyrillic 
MacDingbat     Macintosh Dingbat 
MacGreek     Macintosh Greek 
MacHebrew     Macintosh Hebrew 
MacIceland     Macintosh Iceland 
MacRoman     Macintosh Roman 
MacRomania     Macintosh Romania 
MacSymbol     Macintosh Symbol 
MacThai     Macintosh Thai 
MacTurkish     Macintosh Turkish 
MacUkraine     Macintosh Ukraine 
SJIS     Shift-JIS, Japanese 
TIS620     TIS620, Thai 
需要說明的是:j2sdk的 US-only 版本只支持第一個表格中的字符集,而國際版(有lib/i18n.jar的那個)則可支持這兩個表格中的字符集。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章