我需要编写一个“简单”实用程序来从 ASCII 转换为 EBCDIC?

Ascii 是从 Java、Web 发展到 AS400。我用谷歌搜索了一下,似乎找不到一个简单的解决方案(也许是因为没有一个:()。我希望有一个开源实用程序或为已经编写的实用程序付费。

也许像这样?

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

谢谢,

斯科特

有帮助吗?

解决方案

JT开放, ,IBM 的 Java 工具箱的开源版本有一组用于访问 AS/400 对象的类,其中包括用于访问本机 AS400 文本文件的 FileReader 和 FileWriter。这可能比编写您自己的转换类更容易使用。

来自 JTOpen 主页:

以下只是您可以使用 JTOpen 访问的众多 i5/OS 和 OS/400 资源中的一小部分:

  • 数据库——JDBC (SQL) 和记录级访问 (DDM)
  • 集成文件系统
  • 程序调用
  • 命令
  • 数据队列
  • 数据区
  • 打印/假脱机资源
  • 产品和 PTF 信息
  • 作业和作业日志
  • 消息、消息队列、消息文件
  • 用户和组
  • 用户空间
  • 系统价值
  • 系统状况

其他提示

请注意,在Java中的String持有Java的本地编码的文本。当保持在存储器中的ASCII或EBCDIC“串”,以便在编码之前作为一个字符串,你将有它在一个字节[]。

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

    }


}

}

您应该使用了Java字符集Cp1047(爪哇5)或CP500(JDK 1.3 +)。

使用String构造:String(byte[] bytes, [int offset, int length,] String enc)

您可以创建一个yoursef这个转换表

这里的是,有一个链接到一个Java示例站点。

我作出这样的容易变换的数据类型的码。

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

它应该是相当简单的写一个地图为EBCDIC字符集,以及一个用于与ASCII字符集,并且在每个返回其他的字符表示。然后,只需在串循环平移,并查找每个字符在地图并将其追加到输出字符串。

我不知道是否有任何转换器的公开可用,但它不应该需要一个多小时左右,越写一个。

这是我一直使用的东西。

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

或许,像我你不严格使用JDBC功能(即写入Dataqueue,在我的情况下),这样以来我们通过多个API通信的自动神奇编码并不适用于你。

我的问题是相似的@ scottyab的某些字符无法映射问题。在我的情况下,示例代码我被引用工作完美,但书写的XML字符串的dataqueue导致[被替换为£。

作为Web开发人员与预先存在的数据库后端的工作几十年的信息,请我不只是有能力为“右”的“错误配置” 作为一个评论者的其他建议

然而,我能够查看哪些编码字符第i很可能通过发出一个命令到400上显示一个已知的良好文件的文件信息字段使用集标识符:DSPFFD *LIB*/*FILE*

这样做给了我很好的信息,包括具体的CCSID集: “CCSID标识符”

在一些信息,我跑进在IBM一个页 EBCDIC ,提供关键信息打印在页面上(因为其具有消失的习惯):

  

扩展版本11.0.0二进制编码的十进制交换码(EBCDIC)   是通常在zSeries(Z / OS)和所使用的编码方案   i系列(系统I®)。

和最有帮助的:

  

一些示例EBCDIC CCSID的是37,500,和1047。

由于我已经从这个问题本身是了解到Cp1047是另一个很好的字符集来尝试(这一次,£变成了重音 “Y”),我试图Cp37看到没有这样的存在charsset,的而是试图Cp037,并得到正确的编码。

它看起来像关键是找到其中的编码字符集标识符(CCSID)在您的系统中使用,并确保您的jt400实例 - 否则正在完善 - 100%匹配到编码设置的AS400,在我的情况的办法的之前我的一生,甚至几十年的业务逻辑前。

我要添加到什么Kwebble和肖恩■找说。我可以使用JTOpen做到这一点。

我需要写入的字段,它为6 0P(6个字节,没有小数点后面,填充)。这对于那些你们谁不神交DDM十进制(11,0)。

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

是的,我使用KWebble提到的库。综观肖恩小号提到DSPPFD,我发现表是使用CCSID 37.这工作。

我使用Cp1047最初试图,因为每艾伦克鲁格的建议。它似乎工作。不幸的是,如果我的CUSTID有5结束,渲染到文件中的数据为B0,而不是5F。其改为Cp037固定的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top