在 Java 中将字符串从 ASCII 转换为 EBCDIC?
-
21-08-2019 - |
题
我需要编写一个“简单”实用程序来从 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)
我作出这样的容易变换的数据类型的码。
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*
在一些信息,我跑进在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固定的。