实际上,我希望用户能够通过使用 Ctrl 键输入少量的 unicode 字符。例如,Ctrl + a 将为“U+00E1 á 或 \u00E1”。
/* Loop through to get user requests */
while((ch = getch()) != KEY_F(1))//F1 for now
{
switch(ch)
{
default:
/* If this is a normal character, it gets */
/* Printed */
if (ch == ctrl('a'))
{
/*FIELD *mycurrentfield = current_field(my_form);
int my_index = field_index(mycurrentfield);
set_field_buffer(mycurrentfield, my_index, "\u00E1");*/
form_driver_w(my_form, OK, '\u00E1');
}
else {
form_driver(my_form, ch);
}
break;
}
}
当我编译时,我收到一条警告,当程序运行时,我得到一个正方形代替我想要的 unicode 字符。如果我使用任何普通字符,比如“#”,它就可以工作,所以问题纯粹是 form_driver 函数不喜欢 unicode。
警告
src/window.cpp:84:38: warning: multi-character character constant [-Wmultichar]
84 | form_driver_w(my_form, OK, '\u00E1');`
我已经使用正确的 -lncursesw 和 -lformsw 标志进行了编译,这些标志应该能够采用“宽”字符。
此外,带有这些标志的普通 print 和 mvprint 函数正在打印 unicode 字符。我在 initscr() 函数之前包含了
我可以将 form_driver_w 函数更改为 form_driver(my_form, '\u00E1') 并且我会收到相同的警告。我也有定义#define _XOPEN_SOURCE_EXTENDED 1。
我尝试了使用 set_field_buffer 函数的解决方法,但这只会在且仅当第一个字段突出显示时将 unicode 字符放置在位置 0 处。而且我找不到仅编辑字段内索引位置的函数。
可能根本没有一个函数可以将 unicode 字符放入表单字段中,但对我来说,ncurses 打印函数都将打印 unicode(如果我想要),这对我来说似乎很奇怪。
在 C 和 C++ 中,
'\u00E1'
是多字节字符常量/文字,其类型为 int
,以及实现定义的值。
请参阅:C 字符常量 和 C 转义序列,或 C++ 字符文字 和 C++ 转义序列,了解有关语言差异和可移植性的详细信息。
form_driver_w
有签名
int form_driver_w(FORM *form, int c, wchar_t wch);
这表明它需要一个
wchar_t
,一个宽字符,可以通过在常量/文字前面加上L
来创建。
L'\u00E1'