将Unicode/UTF8字符添加到C中的ncurses显示
我正在尝试将wchar\u t Unicode字符添加到C中的ncurses显示中 我有一个数组:将Unicode/UTF8字符添加到C中的ncurses显示,c,utf-8,ncurses,C,Utf 8,Ncurses,我正在尝试将wchar\u t Unicode字符添加到C中的ncurses显示中 我有一个数组: wchar_t characters[]={L'\uE030', L'\uE029'}; // containing 2 thai letters, for example 稍后,我尝试使用以下方法将wchar\t从阵列添加到ncurses显示: add_wch(characters[0]); 要提供更多信息,请使用ASCII正常工作,使用: char characters[]={'A',
wchar_t characters[]={L'\uE030', L'\uE029'}; // containing 2 thai letters, for example
稍后,我尝试使用以下方法将wchar\t从阵列添加到ncurses显示:
add_wch(characters[0]);
要提供更多信息,请使用ASCII正常工作,使用:
char characters[]={'A', 'B'};
// and later...
addch(characters[0]);
为了设置区域设置,我添加了include
#include <locale.h>
// in main()
setlocale(LC_CTYPE,"C-UTF-8");
我得到以下编译警告(当然可执行文件将失败):
我尝试过使用addch
,它似乎是宏化的,用于处理wchar\t,但当我这样做时,Unicode字符不会显示,而是显示为ASCII字符
有什么想法吗
我正在使用OSX雪豹,10.6.6
编辑:删除了使用L'\u0E30'
而不是L“\u0E30”
等的wchar\u t[]赋值上的错误。
我还更新了编译器设置以使用C99(添加通用字符名支持)。这两种更改都不能解决问题
仍然没有答案,有人知道如何使用Unicode ncursesaddchar
(add\u wchar?)吗?!救命啊 这不是两个字符:
wchar_t characters[]={L"\uE030", L"\uE029"};
您试图用指针初始化wchar\u t
(整数)值,这将导致编译器出错。或使用:
wchar_t characters[]={L'\uE030', L'\uE029'};
或
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);
}
完全没有经过测试,但应该可以工作。宽字符支持由ncursesw处理。取决于您的发行版,ncurses可能指向那里,也可能不指向那里(似乎不在您的发行版中)
尝试使用-lncursesw
而不是-lncurses
另外,对于区域设置,请尝试调用setlocale(LC\u ALL,”)
在包含ncurses标头之前是否定义了\u XOPEN\u SOURCE\u EXTENDED
?还请注意,除了“
之外,不应将任何字符串传递给setlocale
。传递“
将获得配置的/system区域设置,该区域设置应为基于任何现代系统的UTF-8。像“C-UTF-8”
这样的名称是不可移植的。感谢您提供的提示,但这并不能解决问题,请参阅上面我的编辑。有什么想法吗?@R。。。你有没有可能回答这个问题?我试试看,希望你猜对;)好吧,这不起作用,CCHARW_MAX是未定义的,我真的不知道你是怎么想到这个的,一些解释会有帮助的。我还必须将cchar\t
struct添加到源代码中,按照你的说法,他们推断它已经定义(大概在ncurses中)。等等,你有添加wch吗?我的文档中有它,但它显然没有在我的课程中定义。我有add_wch
,但它似乎不起作用(终端输出是?
代替我正在使用的泰语unicode字符,否则显示ok,例如,如果我直接将它们输入到终端提示符中。)好吧,我被难倒了。(你帖子中的警告似乎暗示你没有add_wch
,你还得到了吗?)也许可以发布/链接你的ncurses.h?我最后是用Lisp而不是C.:)另外,请注意,setlocale
的调用必须在initscr()之前。
wchar_t characters[]={L'\uE030', L'\uE029'};
wchar_t characters[]=L"\uE030\uE029";
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);
}