Читать символы Юникода, используя get_wch - PullRequest
0 голосов
/ 20 апреля 2020

Я пишу приложение ncurses с Rust.

Я хочу, чтобы пользователь мог вводить символы Юникода (UTF-8). Помимо вывода их на экран, я собираюсь создать строку поиска из символов.

Вот минимальный пример:

use ncurses::*;

fn main() {
    initscr();
    loop {
        let input = get_wch();
        match input.unwrap() {
            WchResult::Char(ch) => { 
                match ch {
                    27 => break,
                    _ => { mvaddstr(0, 0, &format!("spam {}", ch)); }
                }
            },
            WchResult::KeyCode(code) => { mvaddstr(0, 0, &format!("eggs {}", code)); }
        }
    }
    endwin();
}

Мне сказали, что если я хочу прочитать UTF- 8 символов, я должен использовать get_wch(), однако при вводе ć выводится ~G. Для символов ASCII выводится spam <ch>.

Как правильно обрабатывать Unicode в приложении ncurses?

1 Ответ

0 голосов
/ 24 апреля 2020

Посмотрите здесь: https://github.com/jeaye/ncurses-rs/blob/master/examples/ex_7.rs.

get_wchar () получает один широкий символ, то есть одно скалярное значение Unicode, сохраненное в i32. Скалярное значение Юникода - это то, что часто называют «символом» в контексте Юникода. UTF-8 кодирует каждый из этих «символов» в 1–4 байта. Соответствующий тип ржавчины - char. Чтобы преобразовать его, вы должны привести его к u32 и использовать метод char :: from_u32 (). Это возвращает вам Option (поскольку не все значения u32 являются действительными скалярными значениями Unicode). После развертывания черта Display char теперь должна позаботиться о том, чтобы закодировать ее в UTF-8 и поместить в выходной поток.

...