如何使用ncurses crate显示一个框画字符?

问题描述 投票:2回答:1

我正在使用 Rust 和 ncurses 编写一个应用程序。

我试图显示一个框画字符('┃'(Unicode 9475 0x2503)),但它好像根本没有打印到屏幕上。当我选择文本时,可以看到它。

Screenshot

这是一个最小的例子:

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"] }
rust ncurses
1个回答
1
投票

作者的说明 以下是一个尽力的分析,主要是基于检查我系统上的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.

© www.soinside.com 2019 - 2024. All rights reserved.