我正在将 RPG 程序中的希伯来语数据发送到 Java 程序,并且某些数据未按预期输入。RPG 程序在 CCSID 65535 的 iSeries 机器上运行。通过远程方法调用访问 java。
Java 程序按逻辑顺序接收大部分希伯来语。然后,我使用 Java 的 Bidi 类对其进行处理,以便在我最终将其写入 PDF 时将其纳入视觉顺序。除了几行是方程式外,几乎所有数据都可以。
假设大写 H 是希伯来语数据。这就是这条线的样子:300 X 250 X 500 :HHHH
我收到这条线是这样的:HHHH: 500 250 X 300 X
500 不是我期望的顺序,Bidi 类没有正确处理它。有一些这样的行,并且是 Bidi 类不使用的唯一行。我会假设这条线是:HHHH: 300 X 250 X 500
因为我相信这将是合乎逻辑的顺序。它似乎将 500 保留在 RTL 段中,然后在到达 X 时翻转到 LTR。有人知道为什么会这样吗?
谢谢你的帮助。
编辑:java 实际上是通过 JNI 而不是 RMI 调用的。
1 回答
所以我最终找出了这里发生了什么,并回答了我自己的问题,以防其他人遇到类似的问题。
希伯来语被存储在 iSeries 的代码页 424 中。这是一个希伯来语代码页,所以在 iSeries 上存储一切都很好。我们在 iSeries 上有一些打印驱动程序可以正确处理希伯来语数据,因此我知道问题必须出在 iSeries 和 Java 之间的传输上,或者是我们在 Java 中创建数据字符串时。
事实证明,iSeries 以打印顺序存储希伯来语,所以它已经按照我需要它的顺序将其写入 PDF。当我们将它传输到 Java 程序时,我们使用的是 RPG 字符字节数组。此字符字节数组在发送到 Java 方法时将转换为 Unicode。这种 Unicode 转换将尝试处理已经按正确顺序排列的双向数据,并且正在乱序移动数据。解决方法是切换到不会进行此转换的 RPG 整数字节数组。然后,当我在 Java 中收到字节数组时,我从 AS400 对象中获取作业的 CCSID 并用它创建一个新字符串。
作业的 CCSID 作为字符集返回。所以在我们基于美国的系统上,这将返回 Cp037,我可以在new String(byte[] source, String charsetName)
构造函数,它将EBCDIC代码页中的字节数组转换为Java的编码。在基于希伯来语的系统上,这将返回 Cp424,我可以用它做同样的事情来转换它。