Страницы

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

среда, 4 марта 2020 г.

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

#c #ncurses


Есть древний как помёт мамонта софт, писаный на С с использованием 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'ом, то выводится корректная строка.
    


Ответы

Ответ 1



Для исправления данной ситуации надо добавить вызов функции 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(); }

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

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