Печать символов Брайля в ncurses
Я попытался напечатать символы Брайля в ncurses.
Это мой код:
#include <ncurses.h>
char *str =
" ⠁⠂⠃⠄⠅⠆⠇⠈⠉⠊⠋⠌⠍⠎⠏\n"
"⠐⠑⠒⠓⠔⠕⠖⠗⠘⠙⠚⠛⠜⠝⠞⠟\n"
"⠠⠡⠢⠣⠤⠥⠦⠧⠨⠩⠪⠫⠬⠭⠮⠯\n"
"⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻⠼⠽⠾⠿\n";
int main(int argc, const char *argv[]) {
initscr();
printw("%s", str);
getch();
printf("%s", curses_version());
endwin();
printf("%s", str);
return 0;
}
Выход:
?~A?~B?~C?~D?~E?~F?~G?~H?~I?~J?~K?~L?~M?~N?~O
?~P?~Q?~R?~S?~T?~U?~V?~W?~X?~Y?~Z?~[?~\?~]?~^?~_
⠠⠡⠢⠣⠤⠥⠦⠧⠨⠩⠪⠫⠬⠭⠮⠯
⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻⠼⠽⠾⠿
Как правильно вывести все символы?
Обновление: я тоже пробовал printf
который, кажется, работает, addstr
производит тот же результат, что и printw
,
Если я поменяю язык с setlocale(LC_ALL, "");
Я получаю вывод:
A B C D E F G H I J K L M N O
P Q R S T U V W X Y Z [ \ ] ^ _
⠠⠡⠢⠣⠤⠥⠦⠧⠨⠩⠪⠫⠬⠭⠮⠯
⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻⠼⠽⠾⠿
1 ответ
С некоторыми экспериментами я обнаружил, что, вероятно, не так:
Ваша программа использует
C
локаль по умолчанию. Это предполагает кодировку ASCII. Это не проблема, когда вы выводите многобайтовые символы сstdio
потому что эти функции просто доставляют байты как есть на консоль. Ноncurses
на самом деле использует локаль, поэтому он может знать такие вещи, как, сколько байтов составляет символ (важно для точного позиционирования) и т. д. Измените вашу программу следующим образом:#include <curses.h> #include <locale.h> int main(int argc, char *argv[]) { // initialize locale to system's default: setlocale(LC_ALL, ""); // now init and use curses ...
Если вы все еще получаете искаженный вывод, ваша система
libncurses
не обрабатывает юникод В этом случае ссылкаncursesw
вместоncurses
и ты должен быть готов.