1

我需要将使用 IBM937 代码页编码的 EBCDIC 编码的文件转换为 UTF-8 格式,以便将文件加载到启用多字节的 DB2 数据库中。

我尝试过 unix recode 和 iconv。他们都没有能力将 IBM 937 转换为 UTF8。我正在寻找这个世界上可以在基于 unix 的系统上执行此操作的任何实用程序(java、perl、unix)。有人可以在这里帮助我吗?

SL

4

2 回答 2

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 是根据非限制性开源许可证发布的,该许可证适用于商业软件和其他开源或免费软件。

以下是ICU提供的服务的一些亮点:

  • 代码页转换:将文本数据与 Unicode 以及几乎任何其他字符集或编码进行转换。ICU 的转换表基于 IBM 数十年来收集的字符集数据,是任何地方可用的最完整的。

  • 排序规则:根据特定语言、地区或国家的约定和标准比较字符串。ICU 的排序基于 Unicode 排序算法加上来自通用语言环境数据存储库的特定于语言环境的比较规则,这是此类数据的综合来源。

  • 格式化:根据所选区域设置的惯例格式化数字、日期、时间和货币金额。这包括将月份和日期名称翻译成所选语言、选择适当的缩写、正确排序字段等。这些数据也来自 Common Locale Data Repository。

  • 时间计算:除了传统的公历之外,还提供多种类型的日历。提供了一套完整的时区计算 API。

  • Unicode 支持:ICU 密切跟踪 Unicode 标准,提供对所有许多 Unicode 字符属性、Unicode 规范化、大小写折叠和 Unicode 标准指定的其他基本操作的轻松访问。

  • 正则表达式:ICU 的正则表达式完全支持 Unicode,同时提供极具竞争力的性能。

  • Bidi:支持处理包含从左到右(英语)和从右到左(阿拉伯语或希伯来语)数据混合的文本。

  • 文本边界:在文本范围内定位单词、句子、段落的位置,或确定显示文本时适合换行的位置。

以及更多。有关详细信息,请参阅 ICU 用户指南。

于 2011-03-11T19:47:44.710 回答
0

Java 似乎可以将 IBM937 代码页转换为 UTF-8。

您可以将输入格式指定为“cp937”。

以下是 Oracle 页面中有关Character 和 Byte Streams的两种方法:

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();
    }
}
于 2011-03-11T19:37:42.243 回答