Печать символов Брайля в 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 ответ

Решение

С некоторыми экспериментами я обнаружил, что, вероятно, не так:

  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 ...
    
  2. Если вы все еще получаете искаженный вывод, ваша система libncurses не обрабатывает юникод В этом случае ссылка ncursesw вместо ncurses и ты должен быть готов.

Другие вопросы по тегам