繁体   English   中英

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

[英]String/Regular expression characters '[', ']', '{', '}' replaced by spaces on Mainframe TN3270 (with code page 1047,1147,500,249) in C language

我用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)也失败。

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

有人建议。

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

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

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

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

显示正确显示的括号。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM