我将希伯来语数据从RPG程序发送到Java程序,但有些数据并未按预期传入。RPG程序在CCSID为65535的iSeries机器上运行。通过远程方法调用来访问java。
大多数希伯来语是由Java程序按逻辑顺序接收的。然后,我使用Java的Bidi类对其进行处理,以便在最终将其写入PDF时将其转换为可视顺序。除了几行方程式之外,几乎所有的数据都是OK的。
假设大写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调用的。
发布于 2013-07-10 21:15:47
因此,我最终找出了这里发生了什么,并回答了我自己的问题,以防其他人遇到类似的问题。
希伯来语被存储在代码页424中的iSeries上。这是一个希伯来语代码页,所以在iSeries上存储一切都很好。我们在iSeries上有一些能够正确处理希伯来语数据的打印驱动程序,所以我知道问题要么出在iSeries和Java之间的传输上,要么出在我们用Java创建数据字符串的时候。
原来iSeries是按打印顺序存储希伯来语的,所以它已经按照我需要的顺序写到了PDF中。当我们将它传输到Java程序时,我们使用的是RPG字符字节数组。此字符字节数组在发送到Java方法时将转换为Unicode。此Unicode转换将尝试处理已经处于正确顺序且正在无序移动数据的bidi数据。修复方法是切换到RPG整数字节数组,该数组不会执行此转换。然后,当我收到Java语言中的字节数组时,我从一个AS400对象获取作业的CCSID,并用它创建一个新的字符串。
作业的CCSID将以字符集的形式返回。因此,在我们基于美国的系统上,它将返回Cp037,我可以在new String(byte[] source, String charsetName)
构造函数中使用它,它会将EBCDIC代码页中的字节数组转换为Java编码。在基于希伯来语的系统上,这将返回Cp424,我可以用它做同样的事情来转换它。
https://stackoverflow.com/questions/16969418
复制相似问题