Java中的UTF-8到EBCDIC的转换

17
我们的需求是将EBCDIC文本发送到主机。由于其中包含了一些中文字符,因此它们处于UTF8格式。
有没有一种方法可以将这些UTF-8字符转换为EBCDIC?
谢谢, Raj Mohan

UTF-8 转 EBCDIC 的转换是否是无损的?也就是说,您能否来回转换并始终获得相同的 EBCDIC 字节? - Jose
4个回答

10
假设目标系统是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文档网站上找到更多信息。


6
您可以随时使用IBM 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及其对应的Java编码CP420,该代码页用于阿拉伯文本。因此,你应选择适合中文文本的代码页。

6
EBCDIC有许多8位码页,其中许多受到VM的支持。请查看Charset.availableCharsets().keySet(),EBCDIC页面的名称为IBM...(如cp500用于IBM500,可以通过Charset.forName("IBM500").aliases()查看)。
存在两个问题:
1.如果您的字符包含在EBCDIC的不同代码页中,则无法解决此问题。
2.我不确定这些字符集是否在除Windows以外的任何VM中可用。
对于第一个问题,请查看此方法。对于第二个问题,请尝试所需的目标运行时环境。

1
并非所有名为“IBM*”的字符集都是EBCDIC。例如,IBM850 是在美国和西欧版本的Windows命令提示符中使用的标准代码页。 - lavinio

2

对于中档 AS/400(现在称为 IBM i),最好使用 IBM Java Toolkit(jt400.jar),它可以透明地执行所有这些操作(可能会略微提示)。

请注意,在 Java 内部,一个字符是一个 16 位值,而不是 UTF-8(那是一种编码方式)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接