Наше требование - отправить текст EBCDIC на мэйнфрейм. У нас есть некоторые китайские символы, таким образом, формат UTF8. Итак, есть ли способ конвертировать символы UTF-8 в EBCDIC?
Спасибо, Радж Мохан
Наше требование - отправить текст EBCDIC на мэйнфрейм. У нас есть некоторые китайские символы, таким образом, формат UTF8. Итак, есть ли способ конвертировать символы UTF-8 в EBCDIC?
Спасибо, Радж Мохан
Предполагая, что ваша целевая система является мэйнфреймом или средним регистром IBM, она полностью поддерживает все кодировки EBCDIC, встроенные в нее JVM в виде кодировок CPxxxx, соответствующих CCSID IBM (CP обозначает кодовую страницу). Вам нужно будет делать переводы на стороне хоста, поскольку клиентская сторона не будет иметь необходимой поддержки кодирования.
Поскольку Unicode является DBCS и выше и поддерживает каждый известный символ, вы, вероятно, будете нацелены на несколько кодировок EBCDIC; поэтому вы, вероятно, настроите эти кодировки каким-то образом. Попробуйте использовать только клиентские Unicode (UTF-8, UTF-16 и т.д.), При этом переводы выполняются по мере поступления данных на хост и/или покидают хост-систему.
Помимо необходимости делать переводы на стороне хоста, механика такая же, как и любой перевод на Java; например новые строки (байты, кодирование) и String.getBytes(кодирование), а также различные классы NIO и writer. На самом деле нет никакой магии - это ничем не отличается от перевода между, скажем, ISO 8859-x и Unicode, или любым другим SBCS (или ограниченным DBCS).
Например:
byte[] ebcdta="Hello World".getBytes("CP037"); // get bytes for EBCDIC codepage 37
Дополнительную информацию о веб-сайте документации IBM.
EBCDIC имеет много 8-битных кодовых страниц. Многие из них поддерживаются виртуальной машиной. Взгляните на Charset.availableCharsets().keySet()
, страницы EBCDIC называются IBM...
(для IBM500
есть псевдонимы, такие как cp500
, как вы можете видеть по Charset.forName("IBM500").aliases()
).
Есть две проблемы:
Для первого взгляните на этот подход. Для второго попробуйте установить желаемое время выполнения; -)
Вы всегда можете использовать IBM Toolbox для Java (JTOpen), в частности класс com.ibm.as400.access.AS400Text
в jt400.jar.
Это выглядит следующим образом:
int codePageNumber = 420;
String codePage = "CP420";
String sourceUtfText = "أحمد يوسف صالح";
AS400Text converter = new AS400Text(sourceUtfText.length(), codePageNumber);
byte[] bytesData = converter.toBytes(sourceUtfText);
String resultedEbcdicText = new String(bytesData, codePage);
Я использовал кодовую страницу 420 и соответствующее ей java-представление кодировки CP420, эта кодовая страница используется для арабского текста, поэтому вы должны выбрать подходящая кодовая страница для китайского текста.
Для среднего уровня AS/400 (IBM я в наши дни) лучше всего использовать IBM Java Toolkit (jt400.jar), который делает все эти вещи прозрачно (возможно, слегка намекнул).
Обратите внимание, что внутри Java символ имеет 16-битное значение, а не UTF-8 (это кодировка).