Символы строки / регулярного выражения '[', ']', '{', '}' заменены пробелами на мэйнфрейме TN3270 (с кодовой страницей 1047,1147,500,249) на языке C

Я создал функцию на языке Си для идентификации целого числа с некоторыми условиями с помощью регулярных выражений. Выражение регулярного выражения работает нормально на UNIX и других платформах, но когда я использовал тот же кусок кода на мейнфрейме TN3270, символы в строковом / регулярном выражении, такие как '[', ']', '{', '}', заменяются на пробелы во время компиляции. Я пытался использовать '\' перед всеми этими символами и REG_EXTENDED во время regcomp, но без изменений в результате.

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 ответа

Есть несколько факторов в игре. Кодовая страница редактора в ISPF (если это то, что вы используете), настройка терминала для сеанса 3270 в ISPF и кодовая страница для кода, который вы запускаете.

Для 3270 я считаю, что использование кодовой страницы кодовой страницы 1047 работает для меня. Эта кодовая страница отображает открывающие и закрывающие скобки в 0xAD [ и 0xBD ] соответственно. Существует множество других кодовых страниц, но они обычно отображаются для нужд кодирования локалей, которым требуются другие символы для Latin-1.

Настройка кодовой страницы для эмулятора. Например, я использую HostOnDemand, выбрав свойства сеанса, а затем: Настройка 1047 кодовой страницы для терминальной сессии

Далее вам нужно настроить ISPF. Это выбор типа терминала, который поддерживает скобки. В ISPF установите тип терминала 3277A, выбрав Меню -> Настройки. На этом экране отображаются параметры, доступные для моей сессии. Обратите внимание, что я выбрал номер 2

Отображение скобок отображается правильно

Последняя часть - это ваши настройки для C и его Locale. Нашел эту ссылку, которая поможет вам пройти через последние части.

TN3270 - это протокол для подключения к z/OS и другим операционным системам. Я предполагаю, что вы используете z/OS, здесь. В z/OS для кодировки символов используется EBCDIC, а не ASCII. Как говорит @Ctx, разные наборы символов имеют разные сопоставления, и клиент TN3270 должен использовать соответствующее сопоставление наряду с хост-системой.

Поэтому вам нужно использовать кодовую страницу с {, }, (и) в ней. Кодовая страница 1047 часто используется для этого. Но вы должны убедиться, что вы используете его как на хост-системе, возможно, с помощью опции 0 ISPF, так и на вашем клиенте, что может быть сделано различными способами. См. https://www.askthezoslady.com/tag/setting-tso-code-page/ для получения дополнительной информации.

Другие вопросы по тегам