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