Question

Je dois écrire un « simple » util convertir ASCII en EBCDIC?

Le Ascii vient de Java, Web et aller à un AS400. J'ai eu un Google autour, ne peut pas sembler trouver une solution facile (peut-être coz il n'y a pas un :(). J'espérais un util opensource ou payé pour util qui a déjà été écrit.

Comme ce peut-être?

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

Merci,

Scott

Était-ce utile?

La solution

JTOpen , version open source de leur boîte à outils Java d'IBM a une collection de classes pour accéder AS / 400 objets , y compris un FileReader et FileWriter pour accéder à des fichiers texte natifs AS400. Cela peut être plus facile à utiliser l'écriture alors vos propres classes de conversion.

A partir de la page d'accueil JTOpen:

  

Voici quelques-uns des nombreux i5 / OS et OS / 400 ressources que vous pouvez accéder à l'aide JTOpen:

     
      
  • Base de données - JDBC (SQL) et l'accès niveau de l'enregistrement (DDM)
  •   
  • Système de fichiers intégré
  •   
  • Programme appelle
  •   
  • Commandes
  •   
  • files d'attente de données
  •   
  • Zones de données
  •   
  • Imprimer / ressources spool
  •   
  • les produits et les PTF
  •   
  • Offres d'emploi et les journaux d'emploi
  •   
  • Messages, les files d'attente de messages, fichiers de message
  •   
  • Utilisateurs et groupes
  •   
  • espaces de l'utilisateur
  •   
  • Valeurs système
  •   
  • L'état du système
  •   

Autres conseils

S'il vous plaît noter que String en Java contient du texte dans le codage natif de Java. Lorsque vous tenez un ASCII ou EBCDIC « string » en mémoire, avant le codage en tant que chaîne, vous aurez dans un octet [].

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

    }


}

}

Vous devez utiliser le jeu de caractères Java Cp1047 (Java 5) ou CP500 (+ JDK 1.3).

Utilisez le constructeur String: String(byte[] bytes, [int offset, int length,] String enc)

Vous pouvez créer un yoursef avec cette .

est un site qui a un lien vers un exemple Java.

Je fais un code qui transforme facilement les types de données.

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

Il devrait être assez simple d'écrire une carte pour le jeu de caractères EBCDIC, et un pour le jeu de caractères ASCII, et dans chaque retour la représentation de caractères de l'autre. Ensuite, il suffit boucle sur la chaîne à traduire, et rechercher chaque caractère dans la carte et l'ajouter à une chaîne de sortie.

Je ne sais pas s'il y a du public de tout convertisseur disponible, mais il ne devrait pas prendre plus d'une heure ou d'écrire un.

est ce que je l'ai utilisé.

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

Peut-être, comme moi vous n'étiez pas strictement utilisant une fonctionnalité JDBC (écriture à un dataQueue, dans mon exemple), de sorte que le auto-magique encodage n'a pas demandé à vous puisque nous communiquons à travers plusieurs API.

Ma question était semblable à la question de @ scottyab avec certains caractères non cartographiques. Dans mon cas, le code exemple que je référencement fonctionnait parfaitement, mais écrire une chaîne XML à un dataqueue a donné lieu à [être remplacé par £.

En tant que développeur web qui fonctionne avec une base de données pré-existante avec des décennies d'information, comme un autre intervenant Je ne pas simplement la possibilité de « droit » la « mauvaise configuration » suggère .

Cependant, j'ai pu voir quel caractère Set Identifier Codé i employais probablement en émettant une commande au 400 pour afficher des informations sur le terrain de fichier sur un bon fichier connu:. DSPFFD *LIB*/*FILE*

Cela m'a donné de bonnes informations, y compris l'ensemble CCSID spécifiques: CCSID Identifier

Après quelques recherchés sur CCSID , je suis tombé sur une page sur IBM EBCDIC avec des informations clés imprimé sur la page (puisque cela a l'habitude de disparaître):

  

Version 11.0.0 Extended Binary Coded Decimal code d'échange (EBCDIC)   est un schéma de codage qui est généralement utilisé sur zSeries (z / OS), et   iSeries (Système i®).

Et le plus utile:

  

Quelques exemple CCSID EBCDIC sont 37, 500 et 1047.

Depuis que je déjà appris de cette question elle-même est un autre bon Cp1047 jeu de caractères à essayer (cette fois, le £ transformé en un accentué "Y"), j'ai essayé de ne pas voir Cp37 tel charsset existait, mais a essayé et a obtenu le Cp037 encodage droite.

Il semble que la clé est de trouver qui Coded Character Set Identifier (CCSID) est utilisé dans votre système, et veiller à ce que votre instance jt400 - qui est par ailleurs travaille à perfectionner - correspond à 100% à la encodage situé sur l'AS400, dans mon cas chemin avant ma vie et il y a des décennies de logique métier.

Je veux ajouter à ce que Kwebble et Shawn S ont dit. Je peux utiliser JTOpen pour le faire.

Je devais écrire un champ qui était 6 0P (6 octets, rien derrière la virgule, emballé). C'est un nombre décimal (11,0) pour ceux d'entre vous qui ne digèrent pas le 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));

Oui, je la bibliothèque KWebble mentionné. En regardant DSPPFD comme Shawn S mentionné, j'ai découvert que la table utilisait CCSID 37. Cela a fonctionné.

J'ai d'abord essayé d'utiliser Cp1047, selon la suggestion d'Alan Krueger. Il a semblé fonctionner. Malheureusement, si mon custID a pris fin avec un 5, les données rendues dans le fichier a été au lieu de 5F B0. Changement à Cp037 fixe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top