【发布时间】:2021-11-29 07:25:49
【问题描述】:
我已经编写了将数据从 EBCDIC 转换为 ASCII 的代码,该代码适用于数字和大写字母,例如 1、2、A、B、C。但是,它不能转换小写字母 l 以及何时打印它们在日志中它打印不可读的字符。以下是我们用于转换的代码片段。
public String ebcdicToAscii(String ebcdicValue) {
String asciiBuffer = null;
logger.debug("converting field value frm ebcdic to Ascii. ");
try {
byte[] ebcdicByteArr = ebcdicValue.toString().getBytes(StandardCharsets.ISO_8859_1);
int textLen = ebcdicByteArr.length;
AS400Text textConverter = new AS400Text(textLen);
asciiBuffer = ((String) textConverter.toObject(ebcdicByteArr)).substring(0, textLen);
System.out.println("value: "+asciiBuffer);
} catch (Exception e) {
logger.error("error while converting field value from ebcdic To Ascii: " + e);
}
return asciiBuffer;
}
如何解决这个问题?
【问题讨论】:
-
问题出在AS400Text代码上。
-
您没有将 EBCDIC 转换为 ASCII。假设
ebcdicValue是123,那么ASCII 字节是{0x31,0x32,0x33},EBCDIC 字节是{0xF1,0xF2,0xF3}。要将{0xF1,0xF2,0xF3}转换为{0x31,0x32,0x33}吗?似乎AS400Text将EBCDIC 字节数组(如{0xF1,0xF2,0xF3})作为输入,并返回123字符串。 -
我正在尝试将 {0xF1,0xF2,0xF3} 转换为 {0x31,0x32,0x33}。是的,AS400Text 将 EBCDIC 字节数组作为输入并返回字符串。 AS400Text 有什么问题,我们该如何解决?
-
> AS400Text 有什么问题,我们该如何解决?没有人可以知道,因为没有人知道代码...您已经知道代码可以与数字和大写字母一起使用,因此调用代码看起来不错。您还知道它不适用于小写字母,因此检查的地方可能是转换函数。嗯,但也很可疑:您对无效的 ISO_8859_1 数据使用带有 ISO_8859_1 编码的 getBytes() - 如果您的 Java 运行时支持匹配的 EBCDIC 编码,请使用它。
-
当您将文件读入字符串时,已经进行了字符集转换,如果不使用正确的字符集,该转换会导致数据丢失。另一方面,当您在将文件读入字符串时指定正确的字符集时,例如
new FileReader(file, Charset.forName("IBM500")),你的工作已经完成了。尝试将字符串转换为字符串是没有意义的。