我正在用Rust编写一个ncurses应用程序。
我希望用户能够输入Unicode(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>
.
如何在ncurses应用程序中正确处理Unicode?
请看这里。https:/github.comjeayencurses-rsblobmasterexamplesex_7.rs.
get_wchar()可以得到一个单一的宽字符,也就是一个存储在i32中的Unicode Scalar Value。Unicode Scalar Value就是Unicode语境中常说的 "字符"。UTF-8将每个 "字符 "编码成1到4个Bytes。对应的Rust类型是char。要转换它,你应该将其转换为u32,并使用 char::from_u32() 方法。这将为您返回一个Option(因为并非所有的u32值都是有效的Unicode Scalar值)。在解包之后,char的Display特性现在应该把它编码成UTF-8,并把它放到输出流中。