[英]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函数一样, mvaddwstr
将wchar_t*
作为其字符串参数。 你的编译器应该警告过你(除非它警告你没有mvaddwstr
原型)。 所以字符串应该以L
length属性作为前缀: L"ñandñ"
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.