GET_CP_CONVERT_TABLE
GET_CP_CONVERT_TABLE 谓词创建并返回了 256 字节转换表,以将源代码页中的字符串转换到目标代码页。
以下结构描述了 GET_CP_CONVERT_TABLE 谓词使用的谓词控制块 (VCB)。
语法
struct get_cp_convert_table {
unsigned short opcode;
unsigned char opext;
unsigned char reserv2;
unsigned short primary_rc;
unsigned long secondary_rc;
unsigned char reserv3[8];
unsigned short source_cp;
unsigned short target_cp;
unsigned char FAR * conv_tbl_addr;
unsigned char char_not_fnd;
unsigned char substitute_char;
};
成员
opcode
提供的参数。 该谓词标识操作代码 SV_GET_CP_CONVERT_TABLE。
opext
一个保留字段。
reserv2
一个保留字段。
primary_rc
返回的参数。 指定在谓词完成时由 APPC 设置的主要返回代码。 有效的返回代码因发出的 APPC 谓词而异。 有关此谓词的有效错误代码,请参阅“返回代码”。
secondary_rc
返回的参数。 指定在谓词完成时由 APPC 设置的次要返回代码。 有效的返回代码因发出的 APPC 谓词而异。 有关此谓词的有效错误代码,请参阅“返回代码”。
reserv3
一个保留字段。
source_cp
提供的参数。 指定要从中转换字符的源代码页。 允许的代码页(十进制值)如下:
ASCII 437、850、860、863、865
EBCDIC 037、273、277、278、280、284、285、297、500
还允许 65280 到 65535 范围内的用户定义的代码页。
ASCII 代码页有时称为 PC 代码页;EBCDIC 代码页有时称为主机代码页。
target_cp
提供的参数。 指定要将字符转换到的目标代码页。 有关允许的代码页,请参阅前面的 source_cp 定义。
conv_tbl_addr
提供的参数。 指定包含 256 字节转换表的缓冲区的地址。 该缓冲区必须位于可写段中,并且其长度足以包含该表。
char_not_fnd
提供的参数。 指定当源代码页中的字符不存在于目标代码页中时要执行的操作:
使用 SV_ROUND_TRIP 在转换表中为每个源代码页字符存储唯一值。
使用 SV_SUBSTITUTE 在转换表中存储替代字符(由 substitute_char 指定)。
substitute_char
提供的参数。 指定当源代码页中的某个字符在目标代码页中没有等效项时,要在转换表中存储的字符。
返回代码
SV_OK
主要返回代码;谓词已成功执行。
SV_PARAMETER_CHECK
主要返回代码;由于参数错误,谓词未执行。
SV_INVALID_CHAR_NOT_FOUND
次要返回代码;char_not_fnd 参数包含无效值。
SV_INVALID_DATA_SEGMENT
次要返回代码;为转换表指定的 256 字节区域超出了段边界,或者段不可写。
SV_INVALID_SOURCE_CODE_PAGE
次要返回代码;不支持 source_cp 指定的代码页。
SV_INVALID_TARGET_CODE_PAGE
次要返回代码;不支持 target_cp 指定的代码页。
SV_COMM_SUBSYSTEM_NOT_LOADED
主要返回代码;处理谓词时无法加载或终止某个必需的组件。 因此无法通信。 请联系系统管理员以执行纠正措施。
SV_INVALID_VERB
主要返回代码;opcode 参数与任何谓词的操作代码都不匹配。 未执行任何谓词。
SV_INVALID_VERB_SEGMENT
主要返回代码;VCB 超出了数据段的末尾。
SV_UNEXPECTED_DOS_ERROR
主要返回代码;发生了以下状况之一:
Microsoft® Windows® 系统在处理谓词时遇到错误。 已通过次要返回代码返回了操作系统返回代码。 如果该问题持续出现,请联系系统管理员执行纠正措施。
从另一个应用程序(其中发出的是 Windows SendMessage 函数调用,而不是更常见的 Windows PostMessage 函数调用)调用的消息循环发出了 CSV 。 无法处理谓词。
当 SendMessage 调用你的应用程序时发出了 CSV。 可以使用 InSendMessage Windows API 函数调用来确定应用程序是否是通过 SendMessage 调用的 。
备注
类型 A 字符集包括:
- 大写字母。
- 0 到 9 的数字。
- 特殊字符 $、#、@ 和空格。
系统提供的类型 A 转换表支持此字符集。
源字符串的第一个字符必须是大写字母或特殊字符 $、#或 @。 空格只允许出现在尾部位置。 当方向为 ASCII 到 EBCDIC 时,小写 ASCII 字母将转换为大写 EBCDIC 字母。
类型 AE 字符集包括:
- 大写字母。
- 小写字母。
- 0 到 9 的数字。
- 特殊字符 $、#、@、句点和空格。
系统提供的类型 AE 转换表支持此字符集。
源字符串的第一个字符可以是字符集中除空格外的任意字符。
在转换过程中,嵌入的空白字符(包括第一个位置的空白字符)将转换为 0x00。 尽管这种转换会完成,但将以次要返回代码的形式返回 CONVERSION_ERROR,表示 CSV 库已对提供的数据完成了不可逆的转换。
对于 Windows,COMTBLG 的说明应指向 \SnaBase\Parameters\Client 下的 Windows 注册表。 对于 OS/2 操作系统,包含表的目录和文件必须由环境变量 COMTBLG 指定。 (如果找不到该文件,系统将返回 SV_TABLE_ERROR 参数检查)。
仅当生成了另一个转换表以在相同的两个代码页之间反向转换时,char_not_fnd 的 SV_ROUND_TRIP 值才有用。 如果在生成两个转换表时指定 SV_ROUND_TRIP 值,将一个代码页中的任一字符转换到另一个代码页,然后再转换回来时,该字符将保持不变。
对 char_not_fnd 使用 SV_SUBSTITUTE 值时,将转换后的字符串转换回到原始代码页不一定会重新创建原始字符串。
仅当 char_not_fnd 设置为 SV_SUBSTITUTE 时,才使用 substitute_char 。
存储在转换表中的值是与字符关联的 ASCII 值。 如果该表用于从 ASCII 到 EBCDIC 的转换,则转换后的字符串中显示的字符是与 EBCDIC 数字值(而不是 ASCII)关联的字符。
例如,如果在 创建 ASCII 到 EBCDIC 转换表时提供下划线 () 字符 (ASCII 值 F6) ,则转换后的字符串中显示的字符将为 6,即与 EBCDIC 中的值 F6 关联的字符。若要使用 \ 字符作为 ASCII 到 EBCDIC 转换表中的替换字符,应提供值 E1 (EBCDIC) 中与 _ 字符关联的值,而不是实际字符。
代码页是将特定 ASCII 或 EBCDIC 值与特定字符关联的表。 如果源代码页中的某个字符不存在于目标代码页中,则转换后的(目标)字符串将不同于原始(源)字符串。