ncurses волнуется при записи широкого символа в определенных местах экрана

С концепцией отражения в Java возможно модифицировать поля и методы privates

Модифицированные методы и ответы на них Refleccion en Java

3
задан Thomas Dickey 26 February 2019 в 09:12
поделиться

1 ответ

OP отправил более полный пример, который показывает проблему:

#include <ncurses.h>
#include <string>
#include <iostream>

using namespace std;

int main(){

    initscr();
    setlocale(LC_ALL, "");
    raw();
    keypad(stdscr, TRUE);
    noecho();

    for(int i = 0; i < 10; i++){
        mvaddwstr(0, i, L"\u2550");
    }
    for(int i = 0; i < 6; i++){
        mvaddwstr(1, i, L"\u2550");
    }
    refresh();
    getch();
    endwin();

    return 0;

}

Проблема в том, что библиотека инициализируется с другим языком, чем используется в вызовах mvaddwstr. На странице руководства написано

Библиотека использует локаль, которую инициализировала вызывающая программа. Обычно это делается с помощью setlocale :

setlocale(LC_ALL, "");

Если языковой стандарт не инициализирован, библиотека предполагает, что символы могут быть напечатаны как в ISO-8859-1 , для работы с некоторыми устаревшими программами. Вы должны инициализировать локаль и не полагаться на конкретные детали библиотеки, когда локаль не была настроена.

Поскольку вызов setlocale происходит после initscr , а не раньше, ncurses предполагает, что данные соответствуют ISO-8859-1, и сталкивается с неожиданный сценарий. В других местах, таких как addwstr, ncurses проверяет, являются ли данные действительными wchar_t, но в них используется текущая локаль . В этом случае это далеко от функций, которые, как он знает, должны обрабатываться таким образом (это рендеринг данных, которые уже были обработаны). Сравнение в библиотеке, которое позволяет обрабатывать это с помощью возможности repeat_char , может быть улучшено, но фактическая ошибка в примере программы.

0
ответ дан Thomas Dickey 26 February 2019 в 09:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: