Как сохранить кодировку текста EBCDIC (IBM-1047) в строке Java, не повреждая ее?
Моя Java-программа пытается прочитать текстовый файл (файл VSAM мэйнфрейма преобразован в плоский файл). Я считаю, что это означает, что файл закодирован в формате EBCDIC.
я использую com.ibm.jzos.FileFactory.newBufferedReader(fullyQualifiedFileName, ZFile.DEFAULT_EBCDIC_CODE_PAGE);
открыть файл.
и использовать String inputLine = inputFileReader.readLine()
прочитать строку и сохранить ее в строковой переменной Java для обработки. Я прочитал этот текст, когда хранится в переменной String становится Unicode.
Как я могу гарантировать, что содержимое не будет повреждено при хранении в строковой переменной Java?
2 ответа
Декодер Charset отобразит байты в их правильный Unicode для String. И наоборот.
Единственная проблема заключается в том, что BufferedReader.readLine сбрасывает окончания строки (также в конце строки EBCDIC NEL char, \u0085
- также признанный перевод строки Unicode). Поэтому при написании напишите NEL самостоятельно или установите свойство разделителя строк System.
Нет ничего проще, чем написать модульный тест с 256 символами EBCDIC и конвертировать их туда и обратно.
Если вы прочитали файл с правильным набором символов (что является самым большим предположением здесь), то не имеет значения, что сама Java использует Unicode внутри, Unicode содержит все символы EBCDIC.
Набор символов определяет отображение между символом (кодовой точкой) и одним или несколькими байтами. Файл - это не что иное, как поток байтов. Если вы применяете правильный набор символов, то правильные символы отображаются в памяти.
Скажем, байт 1 отображается в 'A' в наборе символов X и байтах 0 и 65 в UTF-16, затем чтение файла, содержащего байт 1 с использованием набора символов X, заставит систему прочитать символ 'A', даже если эта система в память использует байты 0 и 65 для хранения этого символа.
Однако нет никакого способа узнать, правильно ли вы использовали набор символов, если только вы конкретно не определите, каким должен быть реальный результат.