0

我用 C 语言创建了一个函数,用于使用正则表达式在某些条件下识别整数。正则表达式在 UNIX 和其他平台上运行良好,但是当我在大型机 TN3270 上使用相同的代码时,字符串/正则表达式中的字符,如 '['、']'、'{'、'}' 被替换为编译期间的空格。我尝试在所有这些字符之前使用 '\' 和 regcomp 期间的 REG_EXTENDED,但结果没有变化。

int VALNUM ()
{                                        
   regex_t s_regex, *ps_regex = &s_regex;
   char pc_regexpInt[ ] = "^[+-]{0,1}[0-9]{1,} *";
   printf("pc_regexpInt value:%s\n",pc_regexpInt);
   regcomp(ps_regex, pc_regexpInt, REG_EXTENDED)
   regexec(ps_regex, pc_buffer, 0, NULL, 0);
   regfree(ps_regex);
}

对我来说 printf 返回:

pc_regexpInt value:^ +-  0,1  0-9  1,  *

并且 regexec 对于 pc_buffer 值(如(+120 或 -3.1415))也失败了。

注意:代码编译没有问题,这里我只是写了一段我的代码。这里缺少声明和所有内容,这不是问题。

任何人请建议。

4

2 回答 2

2

有几个因素在起作用。ISPF 中编辑器的代码页(如果您正在使用)、ISPF 中 3270 会话的终端设置以及您正在运行的代码的代码页。

对于 3270,我发现使用代码页 Codepage 1047 对我有用。该代码页将左括号和右括号分别映射到 0xAD[和 0xBD ]。还有许多其他代码页,但它们通常被映射为需要其他字符到 Latin-1 的语言环境的编码需求。

设置模拟器的代码页。例如,我通过选择会话上的属性来使用 HostOnDemand,然后: 为终端会话设置 1047 代码页

接下来,您需要 ISPF 设置。这是选择支持括号的终端类型。在 ISPF 中,通过选择 Menu -> Settings 将终端类型设置为 3277A。 这个屏幕显示了我的会话的选项。 请注意,我选择了数字 2

显示正确显示的括号。

最后一部分是您对 C 及其语言环境的设置。找到这个参考资料,应该可以帮助您完成最后的工作。

于 2018-10-11T03:58:56.563 回答
1

TN3270 是一种用于连接 z/OS 和其他操作系统的协议。我假设您在这里使用的是 z/OS。通常,z/OS 使用 EBCDIC 而不是 ASCII 进行字符编码。正如@Ctx 所说,不同的字符集有不同的映射,TN3270 客户端需要使用适当的映射以及主机系统。

因此,您需要使用其中包含 {、}、( 和 ) 的代码页。代码页 1047 通常用于此目的。但是您需要确保在主机系统(可能通过 ISPF 选项 0 设置)和客户端中都使用它,这可以通过多种不同的方式完成。有关更多信息,请参阅https://www.askthezoslady.com/tag/setting-tso-code-page/

于 2018-10-10T13:49:10.967 回答