Как конвертировать EBCDIC с китайскими буквами в формат UTF-8

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

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

SL

2 ответа

Взгляните на 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 и Globalization для программных приложений. ICU широко переносим и дает приложениям одинаковые результаты на всех платформах и между C/C++ и программным обеспечением Java. ICU выпускается по неограниченной лицензии с открытым исходным кодом, которая подходит для использования как с коммерческим программным обеспечением, так и с другим открытым или свободным программным обеспечением.

Вот несколько основных моментов услуг, предоставляемых ICU:

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

  • Сопоставление: сравнивайте строки в соответствии с соглашениями и стандартами конкретного языка, региона или страны. Параметры сортировки ICU основаны на алгоритме сортировки Unicode плюс правила сравнения для конкретных локалей из общего репозитория данных локали, который является исчерпывающим источником данных этого типа.

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

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

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

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

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

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

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

Похоже, что 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();
    }
}
Другие вопросы по тегам