2011-03-11 834 views
1

我有一個要求,將使用IBM937代碼頁編碼的EBCDIC編碼文件轉換爲UTF-8格式,以便將文件加載到支持多字節的DB2數據庫。如何將中文字符的EBCDIC轉換爲UTF-8格式

我試過unix recode和iconv。他們都沒有能力將IBM 937轉換爲UTF8。我正在尋找這個世界上的任何實用程序(java,perl,unix),這可以在基於unix的系統上實現。有人可以幫我嗎?

SL

回答

0

看來Java可以將IBM937代碼頁轉換爲UTF-8。

您將輸入格式指定爲「cp937」。

這裏是Character and Byte Streams從Oracle頁兩種方法:

static String readInput() { 

    StringBuffer buffer = new StringBuffer(); 
    try { 
     FileInputStream fis = new FileInputStream("test.txt"); 
     InputStreamReader isr = new InputStreamReader(fis, 
          "cp937"); 
     Reader in = new BufferedReader(isr); 
     int ch; 
     while ((ch = in.read()) > -1) { 
      buffer.append((char)ch); 
     } 
     in.close(); 
     return buffer.toString(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

static void writeOutput(String str) { 

    try { 
     FileOutputStream fos = new FileOutputStream("test.txt"); 
     Writer out = new OutputStreamWriter(fos, "UTF8"); 
     out.write(str); 
     out.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

這一個initally沒有工作。當我導入icu4j字符集庫和reran時,它似乎運行良好。然而,我的中文ebcdic chars似乎沒有得到應有的轉變?有什麼想法嗎? – SNL

+0

原來的字符是這樣的: 凧刡凮剭勄剭刣剭刡匎刪僔働っ牼僉僌僑僒匎刪僔働っ牼僉僌僑僒??? 轉換後,我得到的東西,如: ブイピーシーエーインクVPㄣLOSTンクVPㄣLOSTブイピーシーエーインク – SNL

+0

@SNL:我首先想到的是,你確定輸入是IBM937(CP937)?還有一些其他的IBM EBCDIC中文字符頁面。有CP1371,CP950,CP964和CP948。 –

1

看看ICU(Unicode的國際組件):http://site.icu-project.org/

它有一個IBM-937的轉換器:http://demo.icu-project.org/icu-bin/convexp?conv=ibm-937_P110-1999&s=ALL

CU是一個成熟的,廣泛使用的 C/C++和Java庫,提供 Unicode和全球化支持 軟件應用程序。 ICU廣泛適用於便攜式應用程序,並且在所有平臺上爲應用程序提供 相同的結果,並在C/C++和Java軟件之間爲應用程序提供 。 ICU 是根據非限制性 開放源代碼許可證發佈的,適用於商業軟件 以及其他開放源代碼軟件或免費 軟件。

這裏是伊斯蘭法院聯盟提供的 服務的幾大亮點:

  • 代碼頁轉換:轉換文本 數據或從Unicode和幾乎任何其他 字符集或編碼。 ICU的 轉換表基於IBM收集的數十年的課程 的charset 數據,並且是最爲全面的可用於任何地方的 。

  • 歸類:根據比較給 一個 特定語言,區域或國家 的公約和標準字符串。 ICU的排序規則基於 Unicode排序算法加上 特定於區域的比較規則 Common Locale Data Repository, 這種類型的 數據的全面來源。

  • 格式:格式化數字,日期, 時間和貨幣金額根據 所選語言環境的約定。 這包括翻譯月份和 日名稱到所選擇的語言, 選擇合適的縮寫, 排序字段正確等,這 數據也來自通用語言環境 數據存儲庫。

  • 時間計算:多種類型的 日曆提供超出 傳統的公曆日曆。一 徹底組時區計算 提供的API。

  • Unicode支持:ICU密切跟蹤 Unicode標準,所有的Unicode許多字符 性能提供方便 接入,統一 規範化,案例摺疊以及由 Unicode標準規定的其他 基本操作。

  • 正則表達式:ICU的常規 表達式完全支持Unicode 同時提供極具競爭力的 性能。

  • 的雙向:用於處理包含的左到右 (英文版),從右到左(阿拉伯或 希伯來語)數據的混合物文本 支持。

  • 文本邊界:找到的位置的單詞,句子,段落 內 一定範圍的文本,或識別位置 顯示文本時,這將是適合於線 包裝。

還有更多。詳情請參閱ICU用戶指南。

+0

感謝您的答覆,任何示例幫助轉換ebcdic爲utf8從文件中讀取字符? – SNL

+0

不在java中。 .Net世界有System.Text.Encoding類,它支持不同編碼之間的轉換。微軟框架對[某些] EBCDIC編碼,但不支持IBM 937不知道什麼單(開源.NET)支持......或者這將是多麼難寫一個自定義編碼。 .Net的方式是讀取一組八位字節並將其傳遞給編碼器/解碼器,並獲得一個字符串作爲回報。由於需要處理單字節和雙字節模式之間的移入和移出,EBCDIC雙字節填充使其複雜化。 –