我正在使用 Rust 和 ncurses 编写一个应用程序。
我试图显示一个框画字符('┃'(Unicode 9475 0x2503)),但它好像根本没有打印到屏幕上。当我选择文本时,可以看到它。
这是一个最小的例子:
use ncurses::*;
fn populate_line_numbers() {
for i in 0..LINES() {
mvaddstr(i, 0, &i.to_string());
}
mvvline(0, 4, 9475, LINES());
refresh();
}
fn main() {
setlocale(LcCategory::all, "");
initscr();
start_color();
keypad(stdscr(), true);
noecho();
loop {
let user_input = get_wch();
match user_input.unwrap() {
WchResult::Char(ch) => {
match ch {
27 => break,
_ => {
addstr(&std::char::from_u32(ch).unwrap().to_string());
refresh();
}
}
},
WchResult::KeyCode(code) => {
match code {
KEY_F5 => {
populate_line_numbers();
},
_ => {}
}
}
}
}
endwin();
}
点击 F5 以使程序显示行号。
怎么能让字符和普通文字一样呢?我试着用一堆东西一起OR,但都没有效果。
Cargo.toml
[dependencies]
ncurses = { version = "5.99.0", features = ["wide"] }
作者的说明 以下是一个尽力的分析,主要是基于检查我系统上的ncurses.h,并将其与源代码中的 ncurses-rs. 我可能在一些细节上有误。
In ncurses, the chtype
类型的别名(这是 mvvline
)表示一个单字节字符加上一些外观元数据。它不能存储一个多字节的字符。所以 mvvline
根本无法显示 ┃
.
(你之所以得到一条看不见的线,大概是因为你的值是 9475
代表一个控制字符,有一些虚假的外观信息。我不知道如何解码它。如果你在字节值上做手脚,我相信你可以让线条改变颜色,包含任何你想要的ASCII字符)。)
要使用 "宽"(多字节)字符画线,你必须链接到一个支持宽字符的ncurses版本,并且使用宽字符版本的 mvvline
貌似叫 mvvline_set
. 该函数取一个 const cchar_t *
参数而不是 chtype
,其中 cchar_t
是一个包含一个多字节字符和一些元数据的结构。
不幸的是,尽管ncurses crate确实链接到了正确版本的ncurses库,但它并没有提供任何方法来调用 mvvline_set
. ncurses-rs API中还缺少一些其他函数,主要是那些使用了 cchar_t
结构。这意味着你不能在面向字符的ncurses函数中使用Unicode画线字符,除非你自己编写绑定。
你仍然可以在 UTF-8 字符串中使用多字节字符,并将它们传递给面向字符串的函数,如 mvaddstr
.