我有这个程序:
\n\n#include <ncurses.h>\nint main () {\n initscr();\n mvaddstr(0, 0, " A B C D E ");\n mvaddstr(1, 24, "\xc3\xb1and\xc3\xb1");\n mvaddstr(1, 34, "esdr\xc3\xb1jul\xc3\xb1");\n refresh();\n getch();\n endwin();\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n当 ncurses 打印第一个单词 (\xc3\xb1and\xc3\xb1) 时,当随后移动到另一个位置(在本例中为 1, 34)时,实际上它会移动到另一个位置,因此第二个单词会打印在另一个位置柱子。
\n\n那么它应该是什么样子的:
\n\n A B C D E \n \xc3\xb1and\xc3\xb1 esdr\xc3\xb1jul\xc3\xb1\nRun Code Online (Sandbox Code Playgroud)\n\n看起来像这样:
\n\n A B C D E \n \xc3\xb1and\xc3\xb1 esdr\xc3\xb1jul\xc3\xb1\nRun Code Online (Sandbox Code Playgroud)\n\n因为第一个单词中有两个\'\xc3\xb1\'扩展ascii字符。
\n\n知道出了什么问题吗?\n谢谢!
\n如果要使用多字节UTF-8字符,则必须使用支持多字节编译的ncurses库版本,并且需要在程序开头正确设置区域设置。
\n\n多字节 ncurses 库通常称为libncursesw,因此要使用它就足以在链接器选项中更改-lncurses为。-lncursesw您不需要不同的头文件。但是,如果您确实想要使用宽字符函数,则必须在任何指令之前添加#define该符号。使用 gcc(或 clang)执行此操作的最简单方法是添加到编译器选项中。_XOPEN_SOURCE_EXTENDED#include-D_XOPEN_SOURCE_EXTENDED
如果您的 shell 的区域设置已设置为 UTF-8 区域设置(现代 Linux 发行版上通常是这种情况),则插入就足够了
\n\nsetlocale(LC_ALL, "");\nRun Code Online (Sandbox Code Playgroud)\n\n在调用 ncurses 例程之前。这会将可执行文件的区域设置设置为环境变量配置的区域设置。您需要添加
\n\n#include <locale.h>\nRun Code Online (Sandbox Code Playgroud)\n\n到你的标题包含。不需要链接特殊的库来支持区域设置。
\n\n最初的问题表明mvaddwstr正在使用。对于多字节字符来说,这通常是更好的解决方案,但如上所述,如果需要,您可以使用窄字符串接口。但是,无法输出不完整的 UTF-8 序列,因此单字符窄接口addch只能用于小于 128 的字符代码。
此注释适用于尝试mvaddwstr使用 achar*而不是wchar_t*参数进行调用。不要这样做:
与所有w接受字符串的 ncurses 函数一样,mvaddwstr将 awchar_t*作为其字符串参数。你的编译器应该警告你这一点(除非它警告你没有原型mvaddwstr)。因此字符串应该以L长度属性为前缀:L"\xc3\xb1and\xc3\xb1"。