字符串/正则表达式字符'[',']','{','}'用C语言在大型机TN3270(代码页1047,1147,500,249)上替换为空格

时间:2018-10-10 06:21:13

标签: c character-encoding mainframe 3270

我用C语言创建了一个函数,用于使用正则表达式在某些条件下识别整数。 regex表达式在UNIX和其他平台上可以正常工作,但是当我在Mainframe 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)也失败。

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

任何人请提出建议。

2 个答案:

答案 0 :(得分:2)

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

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

设置仿真器的代码页。例如,我通过选择会话上的属性来使用HostOnDemand,然后: Setting 1047 Code page for terminal session

接下来,您需要设置ISPF。这是选择支持括号的终端类型。在ISPF中,通过选择菜单->设置将终端类型设置为3277A。 This screen shows the options in place for my session.  Note that I selected number 2

Showing the brackets correctly displayed.

最后一部分是您对C及其语言环境的设置。找到了这个reference,可以帮助您顺利完成最后一部分。

答案 1 :(得分:1)

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

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