我们的要求是将EBCDIC文本发送到大型机。我们有一些中文字符,因此UTF8格式。 那么,有没有办法将UTF-8字符转换为EBCDIC?
谢谢, Raj Mohan
答案 0 :(得分:9)
假设您的目标系统是IBM大型机或中型系统,它完全支持内置在其JVM中的所有EBCDIC编码,作为名为CPxxxx的编码,对应于IBM CCSID(CP代表代码页)。您需要在主机端进行翻译,因为客户端将没有必要的编码支持。
由于Unicode是DBCS以及更高版本,并支持每个已知字符,因此您可能会针对多个EBCDIC编码;所以你可能会以某种方式配置这些编码。尝试仅使用您的客户端Unicode(UTF-8,UTF-16等),并在数据到达主机和/或离开主机系统时完成翻译。
除了需要在主机端进行翻译之外,其他机制与任何Java翻译相同;例如new String(字节,编码)和String.getBytes(编码),以及各种NIO和writer类。真的没有什么神奇之处 - 它与在ISO 8859-x和Unicode之间或任何其他SBCS(或有限的DBCS)之间进行翻译没有什么不同。
例如:
byte[] ebcdta="Hello World".getBytes("CP037"); // get bytes for EBCDIC codepage 37
您可以在IBM's documentation website找到更多信息。
答案 1 :(得分:5)
EBCDIC有许多8位代码页。其中许多都受VM支持。看一下Charset.availableCharsets().keySet()
,EBCDIC页面的名称为IBM...
(cp500
有IBM500
之类的别名,如Charset.forName("IBM500").aliases()
所示。)
有两个问题:
首先,请看this approach。对于第二个,尝试所需的目标运行时; - )
答案 2 :(得分:4)
您始终可以使用IBM Toolbox for Java(JTOpen),特别是jt400.jar中的com.ibm.as400.access.AS400Text
类。
如下:
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);
我使用了代码页 420 及其对应的编码 CP420 的java表示,此代码页用于阿拉伯语文本,因此,您应该选择适合中文文本的代码页。
答案 3 :(得分:0)
对于中端AS / 400(IBM i,最近),最好的办法是使用IBM Java Toolkit(jt400.jar),它可以透明地完成所有这些工作(可能略有暗示)。
请注意,在Java内部,一个字符是16位值,而不是UTF-8(即编码)。