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

Я создал функцию на языке Си для идентификации целого числа с некоторыми условиями с помощью регулярных выражений.Выражение regex работает нормально в 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 ]

0 голосов
/ 11 октября 2018

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

Для 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 и ее локали.Найдена эта ссылка , которая должна помочь вам пройти через последние части.

0 голосов
/ 10 октября 2018

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

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

...