从MVS系统传输数据到Java环境时应使用哪种代码页/字符集?

3
我遇到了一个有趣的问题(在与旧系统交互时经常会出现这种情况)。 我正在开发一个应用程序(目前在x86 Linux或Windows系统上运行),可以从各种系统接收请求,其中之一是MVS系统。
我试图确定应该使用哪个代码页/字符集来解释来自MVS系统的请求数据。
过去,我使用“cp500”(IBM-500)来解释来自z/OS系统的字节数据,但我担心由于MVS是一个有点老旧的系统,并且由于IBM似乎始终在更改要使用的编码(必须有数十个EBCDIC编码),因此cp500可能不是正确的编码。
我在Java中找到的最好的字符集资源是:http://mindprod.com/jgloss/encoding。然而,从这个网站和IBM Infocenters中,我仍然没有得到明确的答案。
编辑:从我的回复中添加:
在我的问题中,请求数据的来源存在一个明显的漏洞。 在这种情况下,数据的来源是通过Websphere MQ接口。 Websphere MQ确实具有将数据转换为正确编码的功能,但这仅适用于使用MQMessage.readString()读取数据的情况,该方法已被弃用。 我更喜欢使用此方法,但我正在使用专有接口框架,无法更改从MQQueue读取消息的方式,该框架直接从队列中读取字节,因此我需要处理翻译问题。
最终答案:我想跟进一下。 结果证明,正确的字符集确实是cp500(IBM-500)。 但是,我认为结果可能会有所不同。 对于其他遇到相同问题的人,以下是一些提示:
利用Charset.availableCharsets();。 这将为您提供运行时支持的字符集映射。 我迭代了这些集并打印出了我翻译成该字符集的字节数据。 虽然它没有给我想要的答案(主要是因为我不能在数据输入时读取数据),但我想它可能对其他人有帮助。

请参考:http://mindprod.com/jgloss/encoding,以获取支持的字符集列表。

最后,虽然我没有确认过,但请确保您正在使用正确的JRE。我认为IBM运行时支持更多的EBCDIC字符集,而不是OpenJDK或Sun的运行时。


Andrew,availableCharsets()会告诉你可以处理哪些数据,但不会指示你应该使用哪个字符集来处理特定的一组数据。否则,你的转换将返回垃圾数据。但你对IBM的JRE是正确的 - 它为z/OS提供了额外的东西。 - paxdiablo
1个回答

3
"MVS是一个有点过时的系统"?哈!在可靠性是第一位考虑的应用程序中,它仍然是首选的操作系统。现在回到你的问题 :-)
这完全取决于数据是由什么生成的。例如,如果你只是从主机下载文件,FTP协商可能会处理它。但是,由于你提到了Java,它可能是通过JDBC连接到DB2/z,并且JDBC驱动程序将很好地处理它(如果你使用IBM自己的JRE而不是Sun版本,则更好)。
主机上的EBCDIC本身具有相当多的不同编码,因此你至少需要让我们知道数据来自何处。最近的DB2版本在数据库中存储Unicode没有任何问题,这将消除你所有的担忧。
第一项任务是找出数据来自何处,并从你的SysProg获取编码(如果没有自动处理)。
更新:
安德鲁,根据你添加的文本,在那里你说你不能使用提供的翻译,你将不得不使用手动方法。你需要确定数据源并从中获取CCSID。然后手动进行转换为Unicode(或者如果不是Unicode,则使用你正在使用的其他代码页)。

CCSID 500是EBCDIC International(无欧元)的默认代码页,但这些机器在全球范围内都在使用。z/OS转换服务通常是在主机上进行转换的方法。

虽然this是一个iSeries页面,但它列出了大量的CCSID及其字形,同样适用于主机。

您可能只需要确定您是否正在使用CCSID 500或37(或其中一种外语版本),并与Unicode CCSID 1208进行映射。您的SysProg将能够告诉您哪个是正确的。如果您在为美国公司工作,则可能是500或37,但IBM花费了大量精力支持多个代码页。当他们所有的主机软件都默认存储和使用Unicode时,我会很高兴的,这将使事情更加容易。


Pax,你是完全正确的,CCSID 500(IBM-500,cp500)是正确的代码页,再次感谢你的支持。 - user100645

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