java ascii ibm-midrange ebcdic

¿Convertir cadena de ASCII a EBCDIC en Java?



ibm-midrange (10)

Debería ser bastante simple escribir un mapa para el conjunto de caracteres EBCDIC, y uno para el conjunto de caracteres ASCII, y en cada uno devolver la representación de caracteres del otro. Luego simplemente recorra la cadena para traducir, y busque cada carácter en el mapa y añádalo a una cadena de salida.

No sé si hay algún convertidor disponible públicamente, pero no debería tomar más de una hora escribir uno.

Necesito escribir una herramienta ''simple'' para convertir de ASCII a EBCDIC?

El Ascii viene de Java, Web y va a un AS400. He tenido un google alrededor, parece que no puedo encontrar una solución fácil (tal vez porque no hay uno :(). Esperaba una utilidad opensource o una utilidad paga que ya se ha escrito.

¿Me gusta esto?

Converter.convertToAscii(String textFromAS400) Converter.convertToEBCDIC(String textFromJava)

Gracias,

Scott



Debe usar el juego de caracteres Java Cp1047 (Java 5) o Cp500 (JDK 1.3+).

Utilice el constructor de String: String(byte[] bytes, [int offset, int length,] String enc)


JTOpen , la versión de código abierto de IBM de su caja de herramientas Java, tiene una colección de clases para acceder a objetos AS / 400, que incluyen un FileReader y FileWriter para acceder a archivos de texto AS400 nativos. Eso puede ser más fácil de usar que escribir sus propias clases de conversión.

Desde la página de inicio de JTOpen:

Estos son solo algunos de los muchos recursos de i5 / OS y OS / 400 a los que puede acceder utilizando JTOpen:

  • Base de datos - JDBC (SQL) y acceso de nivel de registro (DDM)
  • Sistema de archivos integrado
  • Llamadas de programa
  • Comandos
  • Colas de datos
  • Áreas de datos
  • Recursos de impresión / carrete
  • Información de producto y PTF
  • Trabajos y registros de trabajos
  • Mensajes, colas de mensajes, archivos de mensajes
  • Usuarios y grupos
  • Espacios de usuario
  • Valores del sistema
  • Estado del sistema

Tenga en cuenta que una cadena en Java contiene texto en la codificación nativa de Java. Cuando se tiene una "cadena" ASCII o EBCDIC en la memoria, antes de codificar como una Cadena, la tendrá en un byte [].

ASCII -> Java: new String(bytes, "ASCII") EBCDIC -> Java: new String(bytes, "Cp1047") Java -> ASCII: string.getBytes("ASCII") Java -> EBCDIC: string.getBytes("Cp1047")


Esto es lo que he estado usando.

public static final int[] ebc2asc = new int[256]; public static final int[] asc2ebc = new int[256]; static { byte[] values = new byte[256]; for (int i = 0; i < 256; i++) values[i] = (byte) i; try { String s = new String (values, "CP1047"); char[] chars = s.toCharArray (); for (int i = 0; i < 256; i++) { int val = chars[i]; ebc2asc[i] = val; asc2ebc[val] = i; } } catch (UnsupportedEncodingException e) { e.printStackTrace (); } }


package javaapplication1; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.CharacterCodingException; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.nio.charset.CharsetEncoder; public class ConvertBetweenCharacterSetEncodingsWithCharBuffer { public static void main(String[] args) { //String cadena = "@@@@@@@@@@@@@@@ñâæÃÈÄóöó@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ÔÁâãÅÙÃÁÙÄ@ÄÅÂÉã@âæÉãÃÈ@@@@@@@@"; String cadena = "ñâæÃÈÄóöó"; System.out.println(Convert(cadena,"CP1047","ISO-8859-1")); cadena = "1SWCHD363"; System.out.println(Convert(cadena,"ISO-8859-1","CP1047")); } public static String Convert (String strToConvert,String in, String out){ try { Charset charset_in = Charset.forName(out); Charset charset_out = Charset.forName(in); CharsetDecoder decoder = charset_out.newDecoder(); CharsetEncoder encoder = charset_in.newEncoder(); CharBuffer uCharBuffer = CharBuffer.wrap(strToConvert); ByteBuffer bbuf = encoder.encode(uCharBuffer); CharBuffer cbuf = decoder.decode(bbuf); String s = cbuf.toString(); //System.out.println("Original String is: " + s); return s; } catch (CharacterCodingException e) { //System.out.println("Character Coding Error: " + e.getMessage()); return ""; } } }


Realizo un código que transforma los tipos de datos fácilmente.

public class Converter{ public static void main(String[] args) { Charset charsetEBCDIC = Charset.forName("CP037"); Charset charsetACSII = Charset.forName("US-ASCII"); String ebcdic = "((((((("; System.out.println("String EBCDIC: " + ebcdic); System.out.println("String converted to ASCII: " + convertTO(ebcdic, charsetEBCDIC, charsetACSII)); String ascII = "MMMMMM"; System.out.println("String ASCII: " + ascII); System.out.println("String converted to EBCDIC: " + convertTO(ascII, charsetACSII, charsetEBCDIC)); } public static String convertTO(String dados, Charset encondingFrom, Charset encondingTo) { return new String(dados.getBytes(encondingFrom), encondingTo); } }


Tal vez, como yo , no utilizaste estrictamente una función JDBC (escribir en un Dataqueue, en mi caso), por lo que la codificación auto-mágica no se aplica a ti ya que nos estamos comunicando a través de múltiples API.

Mi problema fue similar al problema de @ scottyab con ciertos caracteres que no están mapeados. En mi caso, el código de ejemplo que estaba haciendo referencia funcionaba perfectamente, pero escribir una cadena xml en una cola de datos resultó en [que se reemplazó por £.

Como desarrollador web que trabajaba con un backend de base de datos preexistente con décadas de información, no solo tenía la capacidad de "corregir" la "configuración incorrecta" como sugiere otro comentarista.

Sin embargo, pude ver qué identificador de conjunto de caracteres codificados probablemente usaría al emitir un comando al 400 para mostrar información de campo de archivo en un archivo bueno conocido: DSPFFD *LIB*/*FILE* .

Al hacerlo, recibí buena información, incluido el conjunto de CCSID específico:

Después de obtener cierta información sobre los CCSID , me encontré con una página en IBM para EBCDIC con información clave impresa en la página (ya que tiene la costumbre de desaparecer):

La versión 11.0.0 Código de intercambio decimal codificado extendido (EBCDIC) es un esquema de codificación que se usa típicamente en zSeries (z / OS®) e iSeries (System®).

Y más útil:

Algunos ejemplos de CCSID EBCDIC son 37, 500 y 1047.

Como ya aprendí de esta pregunta que Cp1047 es otro buen conjunto de caracteres para probar (Esta vez, el £ se convirtió en una "Y" acentuada), probé Cp37 para ver que no existía dicho charsset, pero intenté Cp037 y obtuve la codificación correcta .

Parece que la clave es encontrar qué identificador de conjunto de caracteres codificados (CCSID) se utiliza en su sistema y asegurarse de que su instancia de jt400, que de lo contrario funciona bien, coincida al 100% con el conjunto de codificación de as400, en mi caso antes de mi vida y décadas de lógica de negocios atrás.


Quiero agregar lo que Kwebble y Shawn S dijeron. Puedo usar JTOpen para hacer esto.

Necesitaba escribir en un campo que era 6 0P (6 bytes, nada detrás del decimal, empacado). Eso es un decimal (11,0) para aquellos de ustedes que no asimilan DDM.

AS400PackedDecimal convertedCustId = new AS400PackedDecimal(11, 0); byte[] packedCust = convertedCustId.toBytes((int) custId); String packedCustStr = new String(packedCust, "Cp037"); StringBuilder jcommData = new StringBuilder(); jcommData.append(String.format("%6s", packedCustStr));

Sí, utilicé la biblioteca que KWebble mencionó. Al ver DSPPFD como mencionó Shawn S, descubrí que la tabla usaba CCSID 37. Esto funcionó.

Intenté usar Cp1047 por primera vez, según la sugerencia de Alan Krueger. Pareció funcionar. Desafortunadamente, si mi cliente finaliza con un 5, los datos que se procesaron en el archivo fueron B0 en lugar de 5F. Cambiarlo a Cp037 solucionó eso.