Domanda

Ho bisogno di scrivere un util 'semplice' per la conversione da ASCII a EBCDIC?

L'Ascii proviene da Java, Web e andare a un AS400. Ho avuto un google in giro, non riesco a trovare una soluzione facile (forse coz non ce n'è uno :(). Speravo in un util opensource o pagato per util che è già stato scritto.

Ti piace questa forse?

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

Grazie,

Scott

È stato utile?

Soluzione

JTOpen , la versione open source di IBM della loro cassetta degli attrezzi Java ha una collezione di classi per l'accesso AS / 400 oggetti , tra cui un FileReader e FileWriter per accedere ai file di testo AS400 nativi. Questo può essere più facile da usare poi scrivere le proprie classi di conversione.

Dalla homepage JTOpen:

  

Qui ci sono solo alcuni dei tanti i5 / OS e OS / 400 risorse è possibile accedere utilizzando JTOpen:

     
      
  • Database - JDBC (SQL) e l'accesso a livello di record (DDM)
  •   
  • Integrated File System
  •   
  • chiama Programma
  •   
  • Comandi
  •   
  • code di dati
  •   
  • Aree dati
  •   Risorse
  • Stampa / spool
  •   
  • del prodotto e le informazioni PTF
  •   
  • Lavoro e tronchi di lavoro
  •   
  • Messaggi, code di messaggi, file di messaggi
  •   
  • Utenti e gruppi
  •   
  • spazi utente
  •   
  • Valori di sistema
  •   
  • Stato del sistema
  •   

Altri suggerimenti

Si prega di notare che una stringa in Java tiene testo in codifica nativa di Java. Quando si tiene un ASCII o "stringa" EBCDIC in memoria, prima della codifica come una stringa, avrete in 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 "";

    }


}

}

Si dovrebbe utilizzare impostare il carattere di Java Cp1047 (Java 5) o CP500 (JDK 1.3 +).

Utilizzare il costruttore String: String(byte[] bytes, [int offset, int length,] String enc)

È possibile creare un yoursef con questo tabella di traduzione .

qui è un sito che ha un link ad un esempio Java.

Faccio un codice che trasforma i tipi di dati con facilità.

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

Dovrebbe essere abbastanza semplice scrivere una mappa per il set di caratteri EBCDIC, e uno per il set di caratteri ASCII, e in ogni restituire la rappresentazione carattere dell'altro. Poi basta un loop all'interno di stringhe da tradurre, e cercare ogni personaggio nella mappa e aggiungerla ad una stringa di output.

Non so se ce ne sono di convertitore disponibili al pubblico, ma non dovrebbe prendere più di un'ora o giù di lì di scrivere uno.

Questo è quello che ho usato.

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

Forse, come me non eri strettamente utilizza una funzione JDBC (scrittura su un Dataqueue, nel mio caso), in modo che il auto-magico codifica non si applicano a voi dal momento che stiamo comunicando attraverso molteplici API.

Il mio problema era simile a @ di scottyab problema con certi personaggi non mapping. Nel mio caso, il codice di esempio che stavo riferimento a ha funzionato perfettamente, ma scrivere una stringa XML ad un dataqueue portato a [di essere sostituito con £.

Come sviluppatore web a lavorare con un database back-end pre-esistente con decenni di dati, non ho semplicemente hanno la capacità di "giusto" il "mis-configurazione" , come suggerisce un altro commentatore .

Tuttavia, ho potuto vedere che carattere codificato Set Identifier la stavo usando probabilmente inviando un comando al 400 per visualizzare le informazioni campo del file su una buona file noto:. DSPFFD *LIB*/*FILE*

In questo modo mi ha dato buone informazioni, tra cui la specifica set CCSID: CCSID Identifier

Dopo alcuni href="http://www.think400.dk/files/Whats_with_these_ASCII_EBCDIC_Unicode_CCSIDs.pdf" ricercate sul CCSID , mi sono imbattuto in una pagina su IBM per EBCDIC informazioni chiave stampata sulla pagina (dato che ha l'abitudine di sparire):

  

La versione 11.0.0 estesa decimale codificato in binario Codice Interchange (EBCDIC)   è uno schema di codifica che viene in genere utilizzato su zSeries (z / OS) e   iSeries (i® System).

e più disponibile:

  

Alcuni CCSIDs esempio EBCDIC sono 37, 500 e 1047.

Dal momento che ho già imparato da questa domanda si che Cp1047 è un altro buon set di caratteri da provare (Questa volta, il £ trasformato in un accento "Y"), ho provato a vedere Cp37 esisteva tale charsset, ma tentato Cp037 ed ha ottenuto la codifica a destra.

Sembra che la chiave sta trovando che caratteri codificati Set Identifier (CCSID) è utilizzata nel sistema, e garantire che il vostro jt400 esempio - che altrimenti sta lavorando a perfezionare - partite fino al 100% per la codifica impostato sulla AS400, nel mio caso via prima della mia vita e decenni di logica di business fa.

Voglio aggiungere a ciò che Kwebble e Shawn S hanno detto. Posso usare JTOpen per fare questo.

avevo bisogno di scrivere in un campo che era 6 0P (6 byte, nulla dietro decimale, al sacco). Questo è un decimale (11,0) per quelli di voi che non Grok 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ì, ho usato la biblioteca KWebble menzionato. Guardando DSPPFD come detto Shawn S, ho scoperto che il tavolo stava usando CCSID 37. Questo ha funzionato.

Originariamente ho provato ad utilizzare Cp1047, come da suggerimento di Alan Krueger. E sembrava funzionare. Purtroppo, se il mio CustID è conclusa con un 5, i dati resi nel file era B0 invece di 5F. Cambiare a Cp037 fisso che.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top