Страницы

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

Показаны сообщения с ярлыком ncurses. Показать все сообщения
Показаны сообщения с ярлыком ncurses. Показать все сообщения

среда, 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(); }

воскресенье, 15 декабря 2019 г.

Не могу вывести UTF символ используя вывод в ncurses

#cpp #linux #c #console #ncurses


Данный кусок кода рисует змейку по координатам, используя функцию mvprintw. Не могу
разобраться как вывести на экран символ - ߜ. Вот код программы:

for(int i = 0; i < length; i++)
{
    x = c[i].X;
    y = c[i].Y;
    unsigned wchar_t head;
    switch(d)
    {
    case UP: head = 'A'; break;


    case DOWN: head = L'ߜ'; break; //ߜ
    // Вот этот символ ^


    case LEFT: head = '<'; break;
    case RIGHT: head = '>'; break;
    default: break;
    }
    mvprintw(food.Y, food.X, "%lc", '$');
    //mvprintw(i, 0, "%d %d\n",y,x);
    mvprintw(y, x, "%c", (i) ? '@' : head);
}

    


Ответы

Ответ 1



Попробуйте, работает у вас или нет. #include #include #include int main (int ac, char *av[]) { char *loc = setlocale(LC_ALL, ""); if (av[1]) puts(loc); wchar_t wc = L'я'; wprintf(L"-- %lc --\n", wc); // wc = 'ߜ' wc = L'ߜ'; wprintf(L"-- %lc --\n", wc); // 'ߜ' } У меня avp@avp-ubu1:hashcode$ uname -a Linux avp-ubu1 4.4.0-72-generic #93-Ubuntu SMP Fri Mar 31 14:07:41 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux avp@avp-ubu1:hashcode$ gcc --version gcc.real (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 Copyright (C) 2015 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. avp@avp-ubu1:hashcode$ gcc twc.c && ./a.out -- я -- -- ߜ -- avp@avp-ubu1:hashcode$ ./a.out hashsj en_US.UTF-8 avp@avp-ubu1:hashcode$ Обратите внимание, что обычный вывод (puts/printf и т.п.) несовместим с выводом wide символов (wprintf и т.п.). Возможно у вас где-то тестовая печать до вывода wchar_t и поэтому ничего не отображается.

Ответ 2



Обратите внимание : mvprintw(y, x, "%c", (i) ? '@' : head); Вы пытаетесь переменную типа wchar_t вывести по символу форматирования %c. В руководстве по printf написано: %c If no l modifier is present, the int argument is converted to an unsigned char, and the resulting character is written. If an l modifier is present, the wint_t (wide character) argument is converted to a multibyte sequence by a call to the wcrtomb(3) function, with a conversion state starting in the initial state, and the resulting multibyte string is written. Т.е., попробуйте использовать %lc.

вторник, 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(); }

пятница, 26 октября 2018 г.

Не могу вывести UTF символ используя вывод в ncurses

Данный кусок кода рисует змейку по координатам, используя функцию mvprintw. Не могу разобраться как вывести на экран символ - ߜ. Вот код программы:
for(int i = 0; i < length; i++) { x = c[i].X; y = c[i].Y; unsigned wchar_t head; switch(d) { case UP: head = 'A'; break;
case DOWN: head = L'ߜ'; break; //ߜ // Вот этот символ ^
case LEFT: head = '<'; break; case RIGHT: head = '>'; break; default: break; } mvprintw(food.Y, food.X, "%lc", '$'); //mvprintw(i, 0, "%d %d
",y,x); mvprintw(y, x, "%c", (i) ? '@' : head); }


Ответ

Попробуйте, работает у вас или нет.
#include #include #include
int main (int ac, char *av[]) { char *loc = setlocale(LC_ALL, ""); if (av[1]) puts(loc); wchar_t wc = L'я'; wprintf(L"-- %lc --
", wc); // wc = 'ߜ' wc = L'ߜ'; wprintf(L"-- %lc --
", wc); // 'ߜ'
}
У меня
avp@avp-ubu1:hashcode$ uname -a Linux avp-ubu1 4.4.0-72-generic #93-Ubuntu SMP Fri Mar 31 14:07:41 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux avp@avp-ubu1:hashcode$ gcc --version gcc.real (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 Copyright (C) 2015 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
avp@avp-ubu1:hashcode$ gcc twc.c && ./a.out -- я -- -- ߜ -- avp@avp-ubu1:hashcode$ ./a.out hashsj en_US.UTF-8 avp@avp-ubu1:hashcode$
Обратите внимание, что обычный вывод (puts/printf и т.п.) несовместим с выводом wide символов (wprintf и т.п.).
Возможно у вас где-то тестовая печать до вывода wchar_t и поэтому ничего не отображается.