Frage

Ich brauche ein ‚einfaches‘ util schreiben von ASCII nach EBCDIC zu konvertieren?

Die Ascii kommt aus Java, Web und geht zu einer AS400. Ich habe um eine Google hatte, kann nicht eine einfache Lösung zu finden scheinen (vielleicht coz es nicht ein :( ist). Ich hatte gehofft, für eine Open-Source-util oder für util bezahlt, die bereits geschrieben wurde.

Wie diese vielleicht?

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

Danke,

Scott

War es hilfreich?

Lösung

JTOpen , IBMs Open-Source-Version ihrer Java-Toolbox hat eine Sammlung von Klassen AS / 400-Objekte zuzugreifen, , einen Filereader und Filewriter einschließlich nativer AS400 Textdateien zuzugreifen. Das kann einfacher sein, dann zu benutzen, um Ihre eigenen Konvertierungsklassen schreiben.

Von der JTOpen Homepage:

  

Hier sind nur einige der vielen i5 / OS und OS / 400-Ressourcen, die Sie JTOpen zugreifen können:

     
      
  • Datenbank - JDBC (SQL) und Rekord-Level-Zugriff (DDM)
  •   
  • Integrated File System
  •   
  • Programm ruft
  •   
  • Befehle
  •   
  • Daten Warteschlangen
  •   
  • Datenbereiche
  •   
  • Drucken / Spool-Ressourcen
  •   
  • Produkt- und PTF Informationen
  •   
  • Jobs und Job-Protokolle
  •   
  • Nachrichten, Nachrichtenwarteschlangen Nachrichtendateien
  •   
  • Benutzer und Gruppen
  •   
  • Benutzerräume
  •   
  • Systemwerte
  •   
  • Systemstatus
  •   

Andere Tipps

Bitte beachten Sie, dass ein String in Java Text in Java native Codierung hält. Wenn eine ASCII oder EBCDIC "string" im Speicher zu halten, bevor als String kodieren, können Sie es in einem Byte haben werden [].

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 "";

    }


}

}

Sie sollten entweder der Java-Zeichensatz Cp1047 (Java 5) oder CP500 (JDK 1.3 +).

Verwenden Sie das String-Konstruktor: String(byte[] bytes, [int offset, int length,] String enc)

Sie können eine yoursef mit diesem Übersetzungstabelle rel="nofollow.

Aber hier ist eine Website, die einen Link zu einem Java-Beispiel hat.

Ich mache einen Code, der leicht Datentypen umwandelt.

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

Es sollte ziemlich einfach sein, eine Karte für den EBCDIC-Zeichensatz zu schreiben, und einen für den ASCII-Zeichensatz, und in jeder Rück die Zeichendarstellung des andere. Dann einfach Schleife über die Schnur zu übersetzen, und jedes Zeichen in der Karte suchen und hängen Sie ihn an eine Ausgabezeichenfolge.

Ich weiß nicht, ob es ein Wandler ist öffentlich zugänglich, aber es sollte mehr nehmen nicht als eine Stunde oder so zu schreiben.

Das ist, was ich habe mit.

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

Vielleicht wie ich nicht streng waren Verwendung einer JDBC-Funktion (Schreiben in eine Dataqueue, in meinem Fall), so dass die auto-magische Codierung Sie nicht anwenden, da wir über mehrere APIs sind in Verbindung stehen.

Mein Problem war ähnlich @ scottyab die Ausgabe mit bestimmten Zeichen nicht Mapping. In meinem Fall war der Beispielcode mir Referenzierung perfekt, aber einen XML-String in einem dataqueue Schreiben in Folge [mit £ ersetzt.

Als ein Web-Entwickler arbeitet mit einem bereits bestehenden Datenbank-Backend mit Jahrzehnten von Informationen, Ich habe einfach nicht die Fähigkeit hat, „rechts“ die „mis-Konfiguration“ als ein anderer Kommentator schlägt vor, .

Allerdings konnte ich sehen, welchen Coded Character Set Identifier die i einen Befehls wahrscheinlich unter Verwendung wurde die 400 durch die Ausgabe von Dateifeld Informationen zu einer bekannten guten Datei anzuzeigen. DSPFFD *LIB*/*FILE*

Doing gab mir so gute Informationen, einschließlich der spezifischen CCSID Set: CCSID Identifier

Nach einigen Informationen rel="nofollow auf CCSIDs gesucht , lief ich in eine Seite auf IBM EBCDIC mit Schlüsselinformationen auf der Seite gedruckt (da diese eine Gewohnheit zu verschwinden hat):

  

Version 11.0.0 Erweiterte Binary Coded Decimal Interchange-Code (EBCDIC)   ist ein Codierungsschema, das auf zSeries- (z / OS), die typischerweise verwendet wird, und   iSeries (System i).

Und die meisten hilfreich:

  

Einige Beispiel EBCDIC CCSIDs sind 37, 500 und 1047.

Da ich schon von dieser Frage gelernt selbst dass Cp1047 ist ein weiteres gutes Zeichen gesetzt, um zu versuchen (Diese Zeit, die £ verwandelte sich in eine akzentuierte "Y"), habe ich versucht, Cp37 keine solche charsset zu sehen gab, aber Cp037 versucht und bekam die richtige Codierung.

Es sieht aus wie der Schlüssel ist die Coded Character Set Identifier (CCSID) in Ihrem System verwendet wird, und sicherzustellen, dass Ihre jt400 Instanz - die sonst perfektioniert arbeiten - passend bis zu 100% der Codierung festgelegt auf der aS400, in meinem Fall Weg vor meinem Leben und Jahrzehnten der Geschäftslogik vor.

Ich möchte hinzufügen, auf dem, was Kwebble und Shawn S gesagt haben. Ich kann JTOpen, dies zu tun.

ich brauchte, um ein Feld zu schreiben, die 6 0P war (6 Bytes, nichts hinter dem Komma, verpackt). Das ist eine Dezimalzahl (11,0) für diejenigen, die DDM nicht grok.

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

Ja, habe ich die Bibliothek KWebble erwähnt. Mit Blick auf DSPPFD als Shawn S erwähnt, entdeckte ich, dass die Tabelle der CCSID wurde 37. Das funktionierte.

ich ursprünglich versucht Cp1047 verwenden, laut Alan Krueger Vorschlag. Es schien zu funktionieren. Leider, wenn mein CustID mit einem 5 beendet, die in die Datei gerendert Daten waren B0 statt 5F. Ändern sie Cp037 festgelegt, dass.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top