Pregunta

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

El Ascii proviene de Java, Web y va a un AS400.He buscado en Google y parece que no puedo encontrar una solución fácil (tal vez porque no hay ninguna :()).Esperaba una utilidad de código abierto o una utilidad de pago que ya estuviera escrita.

¿Así tal vez?

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

Gracias,

Scott

¿Fue útil?

Solución

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 , incluyendo un FileReader y FileWriter para acceder a archivos de texto AS400 nativos. Eso puede ser más fácil de usar y luego escribir sus propias clases de conversión.

Desde la página principal JTOpen:

  

Éstos son sólo algunos de los muchos i5 / OS y / OS 400 recursos se puede acceder utilizando JTOpen:

     
      
  • Base de datos - JDBC (SQL) y el acceso a nivel de registro (DDM)
  •   
  • Sistema de archivos integrado
  •   
  • llama Programa
  •   
  • Comandos
  •   
  • Colas de datos
  •   
  • Áreas de datos
  •   recursos
  • Imprimir / carrete
  •   
  • Información del producto y de PTF
  •   
  • Trabajo y registros de trabajo
  •   
  • Los mensajes, colas de mensajes, archivos de mensajes
  •   
  • Usuarios y grupos
  •   
  • espacios de usuario
  •   
  • Los valores del sistema
  •   
  • El estado del sistema
  •   

Otros consejos

Tenga en cuenta que una cadena en Java tiene texto en código nativo de Java. Cuando la celebración de un archivo ASCII o "cadena" EBCDIC en la memoria, antes de la codificación como una cadena, lo tendrás 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")
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 "";

    }


}

}

Debe utilizar ya sea el carácter de Java establecer Cp1047 (Java 5) o CP500 (JDK 1.3 +).

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

Puede crear una yoursef con este tabla de traducción .

aquí es un sitio que tiene un enlace a un ejemplo de Java.

hago 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);
    }
}

Debe ser bastante fácil de escribir un mapa para el juego de caracteres EBCDIC, y uno para el juego de caracteres ASCII, y en cada devolver la representación de caracteres de la otra. A continuación, sólo un bucle sobre la cadena a traducir, y mirar hacia arriba cada carácter en el mapa y añadirlo a una cadena de salida.

No sé si hay cualquier convertidor de disposición del público, pero no debería tomar más de una hora o así para escribir uno.

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 ();
  }
}

Tal vez, como yo no estabas usando estrictamente una función JDBC (Escribir en una cola de datos, en mi caso), por lo que auto-mágico La codificación no se aplica a usted ya que nos comunicamos a través de múltiples API.

Mi problema fue similar al problema de @scottyab con ciertos caracteres que no se mapeaban.En mi caso, el código de ejemplo al que hacía referencia funcionó perfectamente, pero escribir una cadena xml en una cola de datos resultó en que [ fuera reemplazado por £.

Como desarrollador web que trabaja con una base de datos preexistente con décadas de información, No tenía simplemente la capacidad de "corregir" la "mala configuración". como sugiere otro comentarista.

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

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

Despues de algunos información solicitada 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 binario extendido (EBCDIC) es un esquema de codificación que se usa típicamente en ZSeries (Z/OS®) e Iseries (Sistema I®).

Y lo más útil:

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

Desde que ya Aprendí de esta pregunta misma. eso Cp1047 es otro buen conjunto de caracteres para probar (esta vez, £ se convirtió en una "Y" acentuada), lo intenté Cp37 para ver que no existía tal conjunto de caracteres, pero intenté Cp037 y obtuve la codificación correcta.

Parece que la clave es encontrar cuál Identificador de juego de caracteres codificados (CCSID) se utiliza en su sistema, y ​​garantizar que su instancia jt400, que de otro modo funciona a la perfección, coincida al 100% con la codificación establecida en as400, en mi caso forma antes de mi vida y hace décadas de lógica empresarial.

Quiero añadir a lo Kwebble y Shawn S han dicho. Puedo usar JTOpen para hacer esto.

que necesitaba para escribir en un campo que era 6 0P (6 bytes, nada detrás del punto decimal, para llevar). Eso es un número decimal (11,0) para aquellos de ustedes que no asimilo 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í, he utilizado la biblioteca KWebble mencionado. En cuanto a DSPPFD como se ha mencionado Shawn S, descubrí que la mesa estaba usando CCSID 37. Esto funcionó.

Me originalmente intentado usar Cp1047, según la sugerencia de Alan Krueger. Parecía funcionar. Por desgracia, si mi CustID terminó con un 5, los datos prestados en el archivo fue B0 en lugar de 5F. Si lo cambia a Cp037 fijo que.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top