Как конвертировать EBCDIC с китайскими буквами в формат UTF-8 - PullRequest
1 голос
/ 11 марта 2011

У меня есть требование преобразовать файл с кодировкой EBCDIC, который закодирован с использованием кодовой страницы IBM937, в формат UTF-8 для загрузки файла в многобайтовую базу данных DB2.

Я пытался перекодировать Unix и Iconv. Ни у кого из них нет возможности конвертировать IBM 937 в UTF8. Я ищу любую утилиту (java, perl, unix) в этом мире, которая может сделать это в системе на основе Unix. Может ли кто-нибудь помочь мне здесь?

SL

Ответы [ 2 ]

1 голос
/ 11 марта 2011

Взгляните на 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 плюс правила сравнения для конкретного языка из общего хранилища данных, являющегося исчерпывающим источником данных этого типа.

  • Форматирование: форматирование чисел, дат,время и денежные суммы в соответствии с соглашениями выбранного региона.Это включает перевод названий месяцев и дней на выбранный язык, выбор соответствующих сокращений, правильное упорядочение полей и т. Д. Эти данные также поступают из общего хранилища данных локали.

  • Расчет времени: несколько типовкалендари предоставляются за пределами традиционного григорианского календаря.Предоставляется полный набор API для расчета часовых поясов.

  • Поддержка Unicode: ICU внимательно следит за стандартом Unicode, обеспечивая легкий доступ ко всем свойствам символов Unicode, нормализации Unicode, складыванию регистра идругие основные операции, определенные стандартом Unicode.

  • Регулярное выражение: регулярные выражения ICU полностью поддерживают Unicode, обеспечивая при этом весьма конкурентоспособную производительность.

  • Bidi: поддержка обработки текста, содержащего смесь данных слева направо (английский) и справа налево (арабский или иврит).

  • Границы текста: определение положения слов, предложений, абзацевв пределах диапазона текста или определите места, подходящие для переноса строк при отображении текста.

и многое другое.Подробнее см. В Руководстве пользователя ICU.

0 голосов
/ 11 марта 2011

Похоже, что Java может преобразовать кодовую страницу IBM937 в UTF-8.

Вы должны указать формат ввода как "cp937".

Вот два метода со страницы 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();
    }
}
...