[英]How to display a box drawing character using the ncurses crate?
我正在使用 Rust 和 ncurses 编写应用程序。
我正在尝试显示一个方框图字符('┃'(Unicode 9475 / 0x2503)),但就好像它甚至没有打印到屏幕上一样。 当我看到 select 的文字时,可以看出:
这是一个最小的例子:
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使程序显示行号。
字符怎么能像普通文本一样? 我尝试将它与一堆东西一起使用,但没有任何结果。
货运.toml
[dependencies]
ncurses = { version = "5.99.0", features = ["wide"] }
作者注:以下是最大努力的分析,主要基于检查我系统上的 ncurses.h 并将其与ncurses-rs的源代码进行比较。 我可能在某些细节上是错误的。
在 ncurses 中, chtype
类型别名(它是mvvline
的第三个参数)表示一个单字节字符加上一些外观元数据。 它不能存储多字节字符。 所以mvvline
根本无法显示┃
。
(可能你得到一条不可见线的原因是因为值9475
代表一个带有一些虚假外观信息的控制字符。我无法弄清楚如何解码它。如果你摆弄字节值,我相信你可以获取更改 colors 并包含您想要的任何 ASCII 字符的行。)
要使用“宽”(多字节)字符绘制线条,您必须链接到支持宽字符的 ncurses 版本,并使用mvvline
的宽字符版本,它似乎被称为mvvline_set
。 此 function 采用const cchar_t *
参数而不是chtype
,其中cchar_t
是一个包含多字节字符和一些元数据的结构。
不幸的是,尽管 ncurses crate 确实链接到 ncurses 库的正确版本,但它没有公开任何调用mvvline_set
的方法。 ncurses-rs API 中还缺少许多其他函数,主要是使用cchar_t
结构的函数。 这意味着您将无法在面向字符的 ncurses 函数中使用 Unicode 画线字符,除非您自己编写绑定。
您应该仍然能够在 UTF-8 字符串中使用多字节字符并将它们传递给面向字符串的函数,例如mvaddstr
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.