Страницы

Поиск по вопросам

вторник, 21 мая 2019 г.

Ncurses с кодировкой cp866. Выводит заглавные русские символы как два символа, тильда(~) и заглавная латинская

Есть древний как помёт мамонта софт, писаный на С с использованием curses под SCO-Unix и кодировку cp866. Я пытаюсь перенести его на linux (SLES 12) в связи понятно с чем. Вместо curses(которую тупо не нашел) при компиляции использую ncurses. И вроде все работает, но вот есть один косяк конкретно с заглавными русскими буквами - он их отображает вот так:
~Qтолбец:1
вместо
Столбец:1
Код:
#include #include "curses.h"
int main(int argc, char *argv[]) { initscr(); mvaddstr(1, 0, "Тут текст в кодировке cp866."); getch(); }
Выводит:
~Rут текст в кодировке cp866.
Если весь тот-же текст параллельно выводить printf'ом, то выводится корректная строка.


Ответ

Для исправления данной ситуации надо добавить вызов функции use_legacy_coding(2); после initscr();
the parameter is in the range 128-159, i.e., a C1 control code. If use_legacy_coding has been called with a 2 parameter, unctrl returns the parameter, i.e., a one-character string with the parameter as the first character. Otherwise, it returns ''~@'', ''~A'', etc., analogous to ''^@'', ''^A'', C0 controls.
Такой код корректно отображает текст в однобайтовой восьмибитной кодировке CP866:
#include #include "curses.h"
int main(int argc, char *argv[]) { initscr(); use_legacy_coding(2); mvaddstr(1, 0, "Тут текст в кодировке cp866."); getch(); }

Комментариев нет:

Отправить комментарий