应该使用啥代码页/字符集将来自 MVS 系统的数据解释为 Java 环境?

Posted

技术标签:

【中文标题】应该使用啥代码页/字符集将来自 MVS 系统的数据解释为 Java 环境?【英文标题】:What codepage/charset should be used to interpret data coming from an MVS system into a Java Environment?应该使用什么代码页/字符集将来自 MVS 系统的数据解释为 Java 环境? 【发布时间】:2009-05-04 04:15:00 【问题描述】:

我遇到了一个有趣的问题(在与遗留系统交互时经常出现这种情况)。我正在开发一个应用程序(目前在 x86 Linux 或 Windows 系统上运行),它可以接收来自各种系统的请求,其中一个是 MVS 系统。

我正在尝试确定我应该使用哪个代码页/字符集来解释来自 MVS 系统的请求数据。

过去,我使用 'cp500' (IBM-500) 来解释 z/OS 系统的字节日期,但是我担心 MVS 有点像遗留系统,而且因为 IBM 似乎就使用什么编码(必须有数十个 EBCDIC 编码)始终改变主意,cp500 可能不是正确的编码。

我发现的关于 Java 字符集的最佳资源是:http://mindprod.com/jgloss/encoding。但是,从这个站点和 IBM 信息中心,我无法得到明确的答案。

编辑:从我对 Pax 的回复中添加如下:

在我的问题中,请求数据的来源有一个明显的漏洞。在这种情况下,数据的来源是通过 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 提供了额外的东西。 【参考方案1】:

“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) 是正确的代码页,再次感谢您的支持。

以上是关于应该使用啥代码页/字符集将来自 MVS 系统的数据解释为 Java 环境?的主要内容,如果未能解决你的问题,请参考以下文章

python 3.6 打开 mvs 数据集

为啥我在 MVS 2010 的代码中出现绿色短划线和绿色框? [复制]

请问运行代码无效字符啥原因?

在多字节的目标代码页中,没有此 unicode 字符可以映射到的字符.啥意思

我的多页迭代 PDF 转换器应该使用啥 XSLT:FO 布局?

使用 IEFs-s-rEQ 宏的 MVS JES2 清除作业