在C语言的ncurses显示中添加Unicode/UTF8字符

15

我试图在C语言的ncurses显示中添加wchar_t Unicode字符。

我有一个数组:

wchar_t characters[]={L'\uE030', L'\uE029'}; // containing 2 thai letters, for example 

然后我尝试使用以下方式将数组中的wchar_t添加到ncurses显示器中:

add_wch(characters[0]);
为了提供更多信息,使用ASCII可以正常运行,使用:

To provide a bit more info, doing this with ASCII works ok, using:

char characters[]={'A', 'B'};

// and later...

addch(characters[0]);

为了设置地区语言选项,我添加了以下包含文件:

#include <locale.h>

// in main()
setlocale(LC_CTYPE,"C-UTF-8");

ncurses的包含方式为:

#include <ncurses.h> 

使用以下命令进行编译:

(编辑: 添加了 C99 标准,以支持通用字符名称.)

gcc -o ncursesutf8 ncursesutf8.c -lm -lncurses -Wall -std=c99

我得到以下编译警告(当然可执行文件将失败):

ncursesutf8.c:48: warning: implicit declaration of function ‘add_wch’

我尝试只使用addch,它似乎是宏,可以使用wchar_t工作,但是当我这样做时,Unicode字符不会显示出来,而是显示为ASCII字符。

有什么想法吗?

我正在使用OS X Snow Leopard 10.6.6

编辑:删除了关于wchar_t []赋值的错误,改用L'\u0E30'而不是L"\u0E30"等。 我还更新了编译器设置以使用C99(添加通用字符名称支持)。 这两个更改都无法解决问题。

仍然没有答案,有谁知道如何使用Unicode ncurses的addchar(add_wchar?)?! 帮帮忙!


1
另外请注意,您永远不应该传递任何字符串而不是 ""setlocale。 传递 "" 将得到配置/系统区域设置,这应该基于任何现代系统的 UTF-8。 像 "C-UTF-8" 这样的名称是不可移植的。 - R.. GitHub STOP HELPING ICE
4个回答

34

宽字符支持通过ncursesw进行处理。根据您的发行版,ncurses可能指向该处(在您的情况下似乎不是这样)。

尝试使用-lncursesw代替-lncurses

另外,对于区域设置,请尝试调用setlocale(LC_ALL, "")


16
请注意,调用setlocale必须在initscr()之前进行。 - user67416

4

这不是2个字符:

wchar_t characters[]={L"\uE030", L"\uE029"};

您正在尝试使用指针初始化wchar_t(整型)值,这应该会导致编译器出现错误。请改用以下方法:

wchar_t characters[]={L'\uE030', L'\uE029'};

或者

wchar_t characters[]=L"\uE030\uE029";

谢谢你的建议,但这并没有解决问题,请看我上面的编辑。有什么想法吗? - ocodo
@R ... 你有没有这个问题的答案? - ocodo

1

cchar_t被定义为:

typedef struct {
    attr_t  attr;
    wchar_t chars[CCHARW_MAX];
} cchar_t;

所以你可以尝试:

int add_wchar(int c)
{
    cchar_t t = {
        0, // .attr
        {c, 0} // not sure how .chars works, so best guess
    };
    return add_wch(t);
}

尚未经过测试,但应该可以正常工作。


我会尝试的,希望你猜得对 ;) - ocodo
嗯,那个没起作用,CCHARW_MAX未定义,我真的不知道你是怎么想出来的,一些解释会很有帮助。我还不得不在源代码中添加cchar_t结构体,你的写法暗示它已经被定义了(可能是在ncurses中)。 - ocodo
等等,你add_wch吗?我的文档里有它,但是在我的ncurses.h中显然没有定义。 - David X
我有add_wch函数,但它似乎不起作用(终端输出的泰语Unicode字符是?,而我使用的其他方式则正常显示,例如如果我直接将它们输入到终端提示符中)。 - ocodo
好的,那我就无能为力了。(你帖子中的警告似乎意味着你没有add_wch,你还在得到这个警告吗?)也许发帖或者分享一下你的ncurses.h文件会有帮助。 - David X

1
你在包含ncurses头文件之前是否定义了_XOPEN_SOURCE_EXTENDED

我最终用Lisp而不是C来完成了这个。 :) - ocodo

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