Pergunta

Eu preciso escrever um 'simples' util para converter de ASCII para EBCDIC?

O Ascii é proveniente de Java, Web e ir para um AS400. Eu tive um google ao redor, parece que não consegue encontrar uma solução fácil (talvez coz não há um :(). Eu estava esperando por um opensource util ou pago util que já foi escrito.

Como este talvez?

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

Obrigado,

Scott

Foi útil?

Solução

JTOpen , versão de código aberto da IBM de sua caixa de ferramentas Java tem uma coleção de classes para acesso AS / 400 objetos , incluindo um FileReader e FileWriter para acessar arquivos de texto AS400 nativa. Isso pode ser mais fácil de usar, em seguida, escrever suas próprias classes de conversão.

Na página inicial JTOpen:

Aqui estão apenas alguns dos muitos i5 / OS e OS / 400 recursos que você pode acessar usando JTOpen:

  • Banco de Dados - JDBC (SQL) e acesso de nível de registro (DDM)
  • Arquivo Sistema Integrado
  • Programa chama
  • Comandos
  • As filas de dados
  • Áreas de dados
  • Imprimir / recursos de spool
  • Produtos e PTF informações
  • Empregos e registros de tarefas
  • Mensagens, filas de mensagens, arquivos de mensagens
  • Usuários e grupos
  • espaços de usuários
  • Os valores do sistema
  • O estado do sistema

Outras dicas

Por favor note que uma String em Java contém texto em codificação nativa do Java. Ao segurar um ASCII ou EBCDIC "string" na memória, antes da codificação como um String, você vai tê-lo em um 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 "";

    }


}

}

Você deve usar o Java conjunto de caracteres Cp1047 (Java 5) ou CP500 (JDK 1.3 +).

Use o construtor de Cordas: String(byte[] bytes, [int offset, int length,] String enc)

Você pode criar um yoursef com este tabela de tradução .

aqui é um site que tem um link para um exemplo Java.

Eu faço um código que tipos de dados transforma facilmente.

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

Deve ser bastante simples para escrever um mapa para o conjunto de caracteres EBCDIC, e um para o conjunto de caracteres ASCII, e em cada retorno a representação de caracteres do outro. Em seguida, basta loop sobre a corda para traduzir, e olhar para cima cada personagem no mapa e anexá-lo a uma cadeia de saída.

Eu não sei se há algum conversor está disponível publicamente, mas não deve demorar mais de uma hora ou mais para escrever um.

Isto é o que eu tenho usado.

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

Talvez, como eu você não eram estritamente usando um recurso JDBC (escrita a um Dataqueue, no meu exemplo), de modo que o auto-mágica codificação de não se aplicar a você uma vez que está se comunicando através de múltiplas APIs.

Meu problema foi semelhante ao de @ scottyab problema com certas não caracteres de mapeamento. No meu caso, o código de exemplo que eu estava se referindo funcionou perfeitamente, mas escrever uma string XML para um dataqueue resultou em [sendo substituído por £.

Como um desenvolvedor web trabalhando com um backend de banco de dados pré-existente com décadas de informações, eu não simplesmente ter a capacidade de a "mis-configuração" "direito" como um outro comentarista sugere .

No entanto, eu era capaz de ver que Coded Character Set Identifier o i foi provavelmente a utilizar através da emissão de um comando para o 400 a informação de campo arquivo de exibição em um arquivo conhecido bom:. DSPFFD *LIB*/*FILE*

Se o fizer, me deu boas informações, incluindo o conjunto específico CCSID: CCSID Identifier

Depois de algum procurado em CCSIDs , eu corri para uma página no IBM para EBCDIC as informações fundamentais impresso na página (desde que tem o hábito de desaparecer):

Versão 11.0.0 Extensão Binary Coded Decimal Código Interchange (EBCDIC) é um esquema de codificação que é tipicamente utilizado no zSeries (z / OS) e iSeries (Sistema i®).

E o mais útil:

Alguns CCSIDs exemplo EBCDIC são 37, 500 e 1047.

Como eu já aprendeu com esta pergunta em si que Cp1047 é um outro jogo bom caráter para tentar (Desta vez, a £ transformou em um acentuado "Y"), eu tentei Cp37 ver nenhuma charsset existiu, , mas tentou Cp037 e tem a codificação correta.

Parece que a chave é encontrar quais conjunto de caracteres codificados Identifier (CCSID) é usado em seu sistema, e garantir que sua instância jt400 - que de outra forma está trabalhando aperfeiçoando - partidas até 100% para o codificação do conjunto sobre o as400, no meu caso maneira antes de minha vida e décadas de lógica de negócios atrás.

Gostaria de acrescentar ao que Kwebble e Shawn S disseram. Eu posso usar JTOpen para fazer isso.

Eu precisava de escrever para um campo que foi de 6 0P (6 bytes, nada atrás do decimal, embalado). Isso é um decimal (11,0) para aqueles de vocês que não o fazem DDM 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));

Sim, eu usei a biblioteca KWebble mencionado. Olhando para DSPPFD como Shawn S mencionado, eu descobri que a mesa estava usando CCSID 37. Isso funcionou.

Inicialmente eu tentei usar Cp1047, conforme sugestão de Alan Krueger. Parecia trabalho. Infelizmente, se a minha CustID terminou com um 5, os dados prestados no arquivo foi B0 vez de 5F. Mudá-lo para Cp037 fixo isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top