Символы строки / регулярного выражения '[', ']', '{', '}' заменены пробелами на мэйнфрейме 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, выбрав свойства сеанса, а затем:
Далее вам нужно настроить ISPF. Это выбор типа терминала, который поддерживает скобки. В ISPF установите тип терминала 3277A, выбрав Меню -> Настройки.
Последняя часть - это ваши настройки для 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/ для получения дополнительной информации.