繁体   English   中英

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

[英]Cannot correctly print extended ASCII characters in NCURSES

我有这个程序:

#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在你的连接选项。 您不需要不同的头文件。 但是,如果您确实想要使用宽字符函数,则必须在任何#include指令之前#define符号_XOPEN_SOURCE_EXTENDED 使用gcc(或clang)执行此操作的最简单方法是将-D_XOPEN_SOURCE_EXTENDED添加到编译器选项中。

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

setlocale(LC_ALL, "");

在任何调用ncurses例程之前。 这将可执行文件的区域设置设置为由环境变量配置的区域设置。 你需要添加

#include <locale.h>

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


最初的问题表明正在使用mvaddwstr 这通常是多字节字符的更好解决方案,但如上所述,您可以根据需要使用窄字符串接口。 但是,您不能输出不完整的UTF-8序列,因此像addch这样的单字符窄接口只能用于小于128的字符代码。

本说明适用于尝试使用char*而不是wchar_t*参数调用mvaddwstr 不要这样做:

像所有接受字符串的w ncurses函数一样, mvaddwstrwchar_t*作为其字符串参数。 你的编译器应该警告过你(除非它警告你没有mvaddwstr原型)。 所以字符串应该以L length属性作为前缀: L"ñandñ"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM