Nuestro requisito es enviar texto EBCDIC a mainframe. Tenemos algunos caracteres chinos, por lo tanto, formato UTF8. Entonces, ¿hay alguna forma de convertir los caracteres UTF-8 a EBCDIC?UTF-8 a EBCDIC en Java
Gracias, Raj Mohan
Nuestro requisito es enviar texto EBCDIC a mainframe. Tenemos algunos caracteres chinos, por lo tanto, formato UTF8. Entonces, ¿hay alguna forma de convertir los caracteres UTF-8 a EBCDIC?UTF-8 a EBCDIC en Java
Gracias, Raj Mohan
Asumiendo que su sistema de destino es un mainframe de IBM o de gama media, que tiene soporte completo para todas las codificaciones EBCDIC construido en él es JVM como codificaciones nombrados CPxxxx, correspondiente al de la IBM CCSID (CP significa página de códigos). Tendrá que hacer las traducciones en el lado del host, ya que el lado del cliente no tendrá la compatibilidad de codificación necesaria.
Dado que Unicode es DBCS y mayor, y es compatible con todos los caracteres conocidos, es probable que se dirija a múltiples codificaciones EBCDIC; entonces es probable que configure esas codificaciones de alguna manera. Intente que su cliente sea Unicode (UTF-8, UTF-16, etc.) solamente, y las traducciones se realicen a medida que los datos lleguen al host y/o abandonen el sistema host.
Aparte de tener que hacer traducciones del lado del host, las mecánicas son las mismas que cualquier traducción de Java; p.ej. nueva cadena (bytes, codificación) y String.getBytes (codificación) y varias clases de NIO y escritor. Realmente no hay magia, no es diferente a la traducción entre, digamos, ISO 8859-x y Unicode, o cualquier otro SBCS (o DBCS limitado).
Por ejemplo:
byte[] ebcdta="Hello World".getBytes("CP037"); // get bytes for EBCDIC codepage 37
Puede encontrar más información sobre IBM's documentation website.
EBCDIC tiene muchas páginas de códigos de 8 bits. Muchos de ellos son compatibles con la máquina virtual. Eche un vistazo a Charset.availableCharsets().keySet()
, las páginas EBCDIC se llaman IBM...
(hay alias como cp500
para IBM500
como puede ver por Charset.forName("IBM500").aliases()
).
hay dos problemas:
Para la primera, eche un vistazo a this approach. Por el segundo, pruebe el tiempo de ejecución deseado ;-)
No todos los conjuntos de caracteres denominados 'IBM *' son EBCDIC. Por ejemplo, [IBM850] (http://en.wikipedia.org/wiki/Code_page_850) es la página de códigos estándar utilizada en las versiones de EE. UU. Y Europa occidental de Windows en el símbolo del sistema. – lavinio
Para el rango medio AS/400 (IBM i en estos días) la mejor opción es usar el IBM Java Toolkit (jt400.jar) que hace todo esto cosas transparentemente (tal vez ligeramente insinuado).
Tenga en cuenta que dentro de Java un carácter tiene un valor de 16 bits, no un UTF-8 (que es una codificación).
Siempre puede utilizar IBM Toolbox para Java (JTOpen), específicamente la clase com.ibm.as400.access.AS400Text
en jt400.jar.
Dice así:
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);
he utilizado el código de la página y su correspondiente representación java de la codificación CP420, este código de páginas se usa para el texto árabe, así, debe elegir la página de códigos adecuada para el texto chino.
¿La conversión de UTF-8 a EBCDIC sería sin pérdidas? Es decir, ¿se puede transformar de un lado a otro y obtener los mismos bytes EBCDIC siempre? –