我们的要求是将 EBCDIC 文本发送到大型机。我们有一些汉字,因此是 UTF8 格式。那么,有没有办法将 UTF-8 字符转换为 EBCDIC?
谢谢,拉杰莫汉
假设您的目标系统是 IBM 大型机或中型机,它完全支持其 JVM 中内置的所有 EBCDIC 编码,即名为 CPxxxx 的编码,对应于 IBM CCSID(CP 代表代码页)。您需要在主机端进行翻译,因为客户端没有必要的编码支持。
由于 Unicode 是 DBCS 和更高版本,并且支持每个已知字符,因此您可能会针对多个 EBCDIC 编码;所以你可能会以某种方式配置这些编码。尝试让您的客户端仅使用 Unicode(UTF-8、UTF-16 等),并在数据到达主机和/或离开主机系统时完成翻译。
除了需要在主机端进行翻译外,其机制与任何 Java 翻译相同;例如 new String(bytes,encoding) 和 String.getBytes(encoding),以及各种 NIO 和 writer 类。真的没有什么神奇之处——这与在 ISO 8859-x 和 Unicode 或任何其他 SBCS(或有限的 DBCS)之间进行转换没有什么不同。
例如:
byte[] ebcdta="Hello World".getBytes("CP037"); // get bytes for EBCDIC codepage 37
您可以在IBM 的文档网站上找到更多信息。
您始终可以使用 IBM Toolbox for Java ( JTOpen ),特别com.ibm.as400.access.AS400Text
是 jt400.jar 中的类。
它是这样的:
int codePageNumber = 420;
String codePage = "CP420";
String sourceUtfText = "أحمد يوسف صالح";
AS400Text converter = new AS400Text(sourceUtfText.length(), codePageNumber);
byte[] bytesData = converter.toBytes(sourceUtfText);
String resultedEbcdicText = new String(bytesData, codePage);
我使用了编码CP420的代码页420及其对应的 java 表示,该代码页用于阿拉伯文本,因此,您应该为中文文本选择合适的代码页。
EBCDIC 有许多 8 位代码页。VM 支持它们中的许多。看一下Charset.availableCharsets().keySet()
,EBCDIC 页面被命名IBM...
(有别名cp500
,IBM500
如您所见Charset.forName("IBM500").aliases()
)。
有两个问题:
首先,看看这种方法。其次,尝试所需的目标运行时 ;-)
对于中端 AS/400(这些天是 IBM i),最好的选择是使用 IBM Java Toolkit (jt400.jar),它透明地完成所有这些事情(可能略有暗示)。
请注意,在 Java 中,字符是 16 位值,而不是 UTF-8(即编码)。