Java中的UTF-8到EBCDIC

时间:2009-04-21 04:36:01

标签: java unicode utf-8 ebcdic

我们的要求是将EBCDIC文本发送到大型机。我们有一些中文字符,因此UTF8格式。 那么,有没有办法将UTF-8字符转换为EBCDIC?

谢谢, Raj Mohan

4 个答案:

答案 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...cp500IBM500之类的别名,如Charset.forName("IBM500").aliases()所示。)

有两个问题:

  1. 如果您在EBCDIC的不同代码页中包含字符,这将无济于事
  2. 我不确定,如果这些字符集在Windows外的任何虚拟机中都可用。
  3. 首先,请看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(即编码)。