C 语言中 Mainframe TN3270(代码页 1047,1147,500,249)上的字符串/正则表达式字符 '[', ']', '', '' 替换为空格

Posted

技术标签:

【中文标题】C 语言中 Mainframe TN3270(代码页 1047,1147,500,249)上的字符串/正则表达式字符 \'[\', \']\', \'\', \'\' 替换为空格【英文标题】:String/Regular expression characters '[', ']', '', '' replaced by spaces on Mainframe TN3270 (with code page 1047,1147,500,249) in C languageC 语言中 Mainframe TN3270(代码页 1047,1147,500,249)上的字符串/正则表达式字符 '[', ']', '', '' 替换为空格 【发布时间】:2018-10-10 06:21:12 【问题描述】:

我用 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,  *

对于像(+120 或 -3.1415)这样的 pc_buffer 值,regexec 也失败了。

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

请大家推荐一下。

【问题讨论】:

TN3270 是终端,而不是大型机。尝试打印 pc_regexpInt 字符串的字符代码。 是的 TN3270 是一个终端,我的意思是我将它与大型机一起使用。和打印字符代码,你的意思是每个字符的ASCII码,包括'['。 '' ? 好吧,我不知道您的大型机是否使用 ASCII。我的意思是将字符串中的每个字符打印为整数。 查看en.wikipedia.org/wiki/IBM_3270#Technical_Information时在字符集中找不到字符[],可能是这里的问题? 最坏的情况你可以使用digraphs 【参考方案1】:

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

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

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

接下来您需要设置 ISPF。这是选择支持括号的终端类型。在 ISPF 中,通过选择 Menu -> Settings 将终端类型设置为 3277A。

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于C 语言中 Mainframe TN3270(代码页 1047,1147,500,249)上的字符串/正则表达式字符 '[', ']', '', '' 替换为空格的主要内容,如果未能解决你的问题,请参考以下文章

有人尝试使用 Perl 通过 PCOMM 或 x3270 执行自动化任务吗?

如何将计算机中的代码复制到 x3270 模拟器中?

BZOJ3270博物馆 概率DP 高斯消元

zoc for mac注册码

Python - 如何在 QWebEnginePage 中使用 mainframe() 方法 [mainframe() 错误]

C 语言字符串模型 ( 字符串翻转模型 | 借助 递归函数操作 逆序字符串操作 | strncat 函数 )