在C语言中打印Unicode符号

13

我正在尝试使用C语言在Linux终端中打印一个Unicode星形字符(0x2605),我按照网站上其他答案提供的语法进行操作,但是没有输出:

#include <stdio.h>
#include <wchar.h>

int main(){

    wchar_t star = 0x2605;
    wprintf(L"%c\n", star);

    return 0;
}

我会感激任何建议,特别是如何让这个与ncurses库一起使用。


你是否遇到了更常见的Unicode字符的问题? - chux - Reinstate Monica
1
@chux 好的,我可以打印值为 0x0061a,但无法打印值为 0x01ceǎ - Luke Collins
2个回答

20

有两个问题: 首先,wchar_t 必须使用 %lc 格式打印,而不是 %c。其次,除非您调用了 setlocale,否则字符集未正确设置,您可能会得到 ? 而不是您的星号。以下代码似乎可以正常工作:

#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main() {
    setlocale(LC_CTYPE, "");
    wchar_t star = 0x2605;
    wprintf(L"%lc\n", star);
}

对于ncurses只需在调用initscr之前初始化语言环境


这样就解决了,谢谢!★ 有没有想法如何使用 ncurses 来进行 mvwprint - Luke Collins
http://stackoverflow.com/questions/15222466/display-wchar-t-using-ncurses - Antti Haapala -- Слава Україні

3
无论您使用stdio还是ncurses,都必须初始化区域设置,如ncurses手册所述。否则,多字节编码(如UTF-8)将无法工作。 wprintw不一定知道wchar_t(尽管它可能使用相同的底层printf,这取决于平台和配置)。
使用ncurses,您可以以以下任何方式显示wchar_t
  • 将其存储在一个wchar_t数组中,并使用waddwstr,或
  • 将其存储在结构中(使用setcchar),并使用wadd_wch作为参数,或
  • wchar_t转换为多字节字符串,并使用waddstr

谢谢回复。我一直在使用宽字符 ncurses 函数时遇到了 隐式声明 错误,是否需要包含其他库? - Luke Collins
2
你缺少一个 #define。通常应该是 _XOPEN_SOURCE_EXTENDED,但大多数平台都有混乱的 ifdef:对于 Linux,只需使用 -D_GNU_SOURCE。你需要链接 -lncursesw,但这不是隐式声明 - Thomas Dickey
你能再解释一下吗? - Luke Collins
1
它可以使用 ncursesw5-config --cflags 进行定义,或者通过 ".pc" 文件进行定义,具体取决于 ncurses 在您的系统上的打包方式。 - Thomas Dickey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接