用户输入后将 unicode 字符输入 NCURSES 表单字段

问题描述 投票:0回答:1

实际上,我希望用户能够通过使用 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() 函数之前包含了 和 setlocale(LC_ALL, "") 行。

我可以将 form_driver_w 函数更改为 form_driver(my_form, '\u00E1') 并且我会收到相同的警告。我也有定义#define _XOPEN_SOURCE_EXTENDED 1。

我尝试了使用 set_field_buffer 函数的解决方法,但这只会在且仅当第一个字段突出显示时将 unicode 字符放置在位置 0 处。而且我找不到仅编辑字段内索引位置的函数。

可能根本没有一个函数可以将 unicode 字符放入表单字段中,但对我来说,ncurses 打印函数都将打印 unicode(如果我想要),这对我来说似乎很奇怪。

c++ c forms ncurses
1个回答
0
投票

在 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'
© www.soinside.com 2019 - 2024. All rights reserved.