Считывание символов в кодировке UTF-8 с клавиатуры в ncurses - PullRequest
0 голосов
/ 25 января 2019

При чтении ввода с клавиатуры в nCurses я использую функцию getch (), которая отлично работает для символов ASCII, но не работает для символов в кодировке UTF-8. Если я нажму символ character на клавиатуре:

int c = getch();

Значение c должно быть в шестнадцатеричном виде: 0xC59B. Но когда я пытаюсь напечатать его значение, я получаю только 0xC5.

Как я могу прочитать весь символ и как правильно использовать функцию getch ()?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

getch читает байты, но UTF-8 является многобайтовым. Вы можете прочитать этот побайтовый код и интерпретировать его, но это работа, которая большинству не нужна. Используйте get_wch, чтобы прочитать (целый) широкий символ .

Предполагается, что вы инициализировали локаль ncurses:

setlocale(LC_ALL, "");

(если вы этого не сделаете, getch все равно не вернет правильные байты).

0 голосов
/ 25 января 2019
Имя

getch происходит от Старой Земли, означающей «характер», который на самом деле является просто «байтом». Этот механизм не понимает многобайтовые кодировки.

Однако, это правильная функция для использования ; вам просто нужно правильно разобраться с его результатом. Повторно вызывайте его и выводите то, что вы получаете, в строку байтов (в вашем конкретном примере вам потребуется два вызова, чтобы получить достаточно байтов для представления конкретного предоставленного символа Unicode), затем интерпретировать эти байты с помощью UTF-8 библиотека .

Не забудьте отфильтровать «особые значения», которые может предоставить getch, поскольку не всегда дает необработанные символы (рассмотрим, например, клавишу F1 !).

...