数据转换

由于在不同运行时环境中解释数据的方式存在差别,因此,程序可能需要对从一种环境传递到另一种环境的数据进行转换。数据转换是在 Java™ 运行时发生的。

在下列运行时情况下,代码也将使用转换表:

例如,如果代码将值放在两个重新定义的记录的其中一条记录中,每个记录都与被传递给另一程序的记录引用同一个内存区,则将使用运行时转换。假定传递的数据的特征根据被赋值的重新定义的记录的不同而有所不同。在这种情况下,在生成时不能了解数据转换的需求。

以下各节提供了下列详细信息:

当调用程序是 Java 代码时的数据转换

下列规则适用于 Java 代码:
  • 当生成的 Java 程序或包装器调用生成的 Java 程序时,就会按照在运行时调用的一组 EGL 类来在调用者中进行转换。在大多数情况下,根本就不需要请求转换,即使调用程序正在访问的远程平台使用的代码页与调用程序使用的代码页不同。然而在下列情况下,必须指定转换表:
    • 调用程序是 Java 代码并且位于支持一种代码页的机器上
    • 被调用程序为非 Java 程序,并且位于支持另一种代码页的机器上

    在这种情况下,表名是一个指示在运行时所需要的转换类型的符号。

  • 当生成的 Java 程序访问远程 MQSeries® 消息队列时,会根据运行时调用的一组 EGL 类来在调用程序中进行转换。如果调用程序正在访问的远程平台使用的代码页与调用程序使用的代码页不同,则在引用 MQSeries 消息队列的关联元素中指定转换表。
下表列示生成的 Java 代码在运行时可访问的转换表。每个名称都具有格式 CSOJx:
x
表示被调用平台上的代码页号。每个号码都是在 Character Data Representation Architecture Reference and Registry(SC09-2190)中指定的。该注册表标识了转换表支持的编码字符集。
语言 被调用程序的平台
UNIX® Windows® 2000/NT/XP z/OS UNIX System Services 或 iSeries™ Java
阿拉伯语 CSOJ1046 CSOJ1256 CSOJ420
简体中文 CSOJ1381 CSOJ1386 CSOJ1388
繁体中文 CSOJ950 CSOJ950 CSOJ1371
西里尔语 CSOJ866 CSOJ1251 CSOJ1025
丹麦语 CSOJ850 CSOJ850 CSOJ277
东欧语系 CSOJ852 CSOJ1250 CSOJ870
英国英语 CSOJ850 CSOJ1252 CSOJ285
美国英语 CSOJ850 CSOJ1252 CSOJ037
法语 CSOJ850 CSOJ1252 CSOJ297
德语 CSOJ850 CSOJ1252 CSOJ273
希腊语 CSOJ813 CSOJ1253 CSOJ875
希伯莱语 CSOJ856 CSOJ1255 CSOJ424
日语 CSOJ943 CSOJ943 CSOJ1390(片假名 SBCS)和 CSOJ1399(拉丁语 SBCS)
韩国语 CSOJ949 CSOJ949 CSOJ1364
葡萄牙语 CSOJ850 CSOJ1252 CSOJ037
西班牙语 CSOJ850 CSOJ1252 CSOJ284
瑞典语 CSOJ850 CSOJ1252 CSOJ278
瑞士德语 CSOJ850 CSOJ1252 CSOJ500
土耳其语 CSOJ920 CSOJ1254 CSOJ1026

如果从 Java 中调用程序时未在链接选项部件中指定转换表值,则缺省转换表是用于英语(美国)的转换表。

转换算法

记录和结构的数据转换是根据缺少子结构的结构项的声明来进行的。

类型为 CHAR、DBCHAR 或 MBCHAR 的数据是根据 Java 转换表(用于在 EGL 生成的调用程序中进行的转换)来转换的。

不会对填充符数据项(没有名称的数据项)或类型为 DECIMAL、PACF、HEX 或 UNICODE 的数据项执行任何转换。

在对 MBCHAR 数据进行的从 EBCDIC 至 ASCII 的转换中,转换例程将删除 Shift-out/Shift-in(SO/SI)字符,并在数据项末尾插入相同数目的空格。在从 ASCII 至 EBCDIC 的转换中,转换例程在双字节字符串两边插入 SO/SI 字符,并在可填写到字段中的最后一个有效字符处截断值。如果 MBCHAR 字段在变长记录中并且当前记录结尾位于 MBCHAR 字段中,则会调整记录长度以反映插入或删除 SO/SI 字符。记录长度指示当前记录在何处结束。

如果调用程序或被调用程序的平台使用 Intel™ 二进制格式而其它平台不使用该格式,则对于类型为 BIN 的数据项,转换例程会使项的字节顺序相反。

对于类型为 NUM 或 NUMC 的数据项,转换例程会使用 CHAR 算法来转换除了最后一个字节之外的所有字节。根据下表中显示的十六进制值来转换符号半字节(字段中最后一个字节的前半个字节)。

类型为 NUM 的 EBCDIC 类型为 NUMC 的 EBCDIC ASCII
F(正号) C 3
D(负号) D 7
使用条款 | 反馈
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.