gpt4 book ai didi

无法在 NCURSES 中正确打印扩展的 ASCII 字符

转载 作者:行者123 更新时间:2023-12-01 12:29:59 25 4
gpt4 key购买 nike

我有这个程序:

#include <ncurses.h>
int main () {
initscr();
mvaddstr(0, 0, " A B C D E ");
mvaddstr(1, 24, "ñandñ");
mvaddstr(1, 34, "esdrñjulñ");
refresh();
getch();
endwin();
return 0;
}

当 ncurses 打印第一个单词 (ñandñ) 时,当移动到另一个位置(在本例中为 1, 34)时,实际上它移动到另一个位置,因此第二个单词被打印在另一列中。

所以它应该是什么样子:
          A         B         C         D         E       
ñandñ esdrñjulñ

看起来像这样:
          A         B         C         D         E       
ñandñ esdrñjulñ

因为第一个单词中有两个 'ñ' 扩展的 ascii 字符。

知道有什么问题吗?
谢谢!

最佳答案

如果要使用多字节 UTF-8 字符,则必须使用编译后支持多字节的 ncurses 库版本,并且需要在程序开始时正确设置语言环境。

多字节 ncurses 库通常称为 libncursesw ,所以使用它就足以改变-lncurses-lncursesw在您的链接器选项中。您不需要不同的头文件。然而,如果你真的想使用宽字符函数,你必须#define符号 _XOPEN_SOURCE_EXTENDED在任何 #include 之前指示。使用 gcc(或 clang)最简单的方法是添加 -D_XOPEN_SOURCE_EXTENDED到您的编译器选项。

如果您的 shell 的语言环境已设置为 UTF-8 语言环境(在现代 Linux 发行版中通常是这种情况),则插入

setlocale(LC_ALL, "");

在调用 ncurses 例程之前。这会将可执行文件的语言环境设置为环境变量配置的语言环境。您需要添加
#include <locale.h>

到您的标题包括。不需要为语言环境支持链接特殊库。

原始问题表明 mvaddwstr被使用。对于多字节字符,这通常是更好的解决方案,但如上所述,如果您愿意,可以使用窄字符串接口(interface)。但是,您不能输出不完整的 UTF-8 序列,因此像 addch 这样的单字符窄接口(interface)只能与小于 128 的字符代码一起使用。

此注释适用于尝试调用 mvaddwstrchar*而不是 wchar_t*争论。不要这样做:

像所有 w ncurses 接受字符串的函数, mvaddwstr需要 wchar_t*作为它的字符串参数。你的编译器应该已经警告过你(除非它警告你没有 mvaddwstr 的原型(prototype))。所以字符串应该以 L 为前缀长度属性: L"ñandñ" .

关于无法在 NCURSES 中正确打印扩展的 ASCII 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35162938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com