在UTF-8中读取ncurses stdin

时间:2016-08-23 01:05:25

标签: c utf-8 ncurses

在使用ncurses在C中开发的Linux程序中,我需要以UTF-8编码读取stdin。但是,每当我这样做时:

wint_t unicode_char=0;
get_wch(&unicode_char);

我在utf-16编码中得到了宽字符(当我用gdb转储变量时,我可以看到它)。我不想将它从utf-16转换为utf-8,我想强制输入一直是UTF-8,无论哪个Linux发行版使用用户配置的任何外语运行我的程序。这是怎么做到的?有可能吗?

修改 : 以下是内部get_wch使用UTF-16(与UTF-32相同)而非UTF-8的示例源和证明,尽管我使用setlocale()配置了UTF-8输入源。

[niko@dev1 ncurses]$ gcc -g -o getch -std=c99 $(ncursesw5-config --cflags --libs) getch.c 
[niko@dev1 ncurses]$ cat getch.c 
#define _GNU_SOURCE
#include <locale.h>
#include <ncursesw/ncurses.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int ct;
wint_t unichar;

int main(int argc, char *argv[])
{
    setlocale(LC_ALL, ""); /* make sure UTF8 */
    initscr();
    raw();
    keypad(stdscr, TRUE);
    ct = get_wch(&unichar); /* read character */
    mvprintw(24, 0, "Key pressed is = %4x ", unichar);

    refresh();
    getch();
    endwin();
    return 0;
}

使用GDB测试代码:


Breakpoint 1, main (argc=1, argv=0x7fffffffded8) at getch.c:18
18      mvprintw(24, 0, "Key pressed is = %4x ", unichar);
Missing separate debuginfos, use: dnf debuginfo-install ncurses-libs-5.9-21.20150214.fc23.x86_64
(gdb) print unichar
$1 = 128270
(gdb) print/x ((unsigned short*) (&unichar))[0]
$2 = 0xf50e
(gdb) print/x ((unsigned short*) (&unichar))[1]
$3 = 0x1
(gdb) print/x ((unsigned char*) (&unichar))[0]
$4 = 0xe
(gdb) print/x ((unsigned char*) (&unichar))[1]
$5 = 0xf5
(gdb) print/x ((unsigned char*) (&unichar))[2]
$6 = 0x1
(gdb) print/x ((unsigned char*) (&unichar))[3]
$7 = 0x0
(gdb) 

输入字符是,其UTF-8应为'f09f948e',如下所述:http://www.fileformat.info/info/unicode/char/1f50e/index.htm

如何直接从get_wch()获取UTF8?或者可能还有其他功能?

P.S。 如果您测试源代码,请链接' - lncursesw',而不是' - lncurses'或使用与上面相同的命令进行编译

1 个答案:

答案 0 :(得分:2)

简短:您 get_wch获取UTF-8。返回wint_t(和状态代码)。

很长: 从ncurses getch获取UTF-8,因为它会在内部转换为wchar_t

  • 您的程序必须一次读取一个字节的编码字符,因为getch只返回字节(可能与视频属性结合)。
  • 在每个窗口结构的单元格中存储wchar_t个值。
  • addch和朋友们尝试收集多字节编码的字节(它的特定于UTF-8,但除此之外没有太多用处)。
  • 如果将光标移动到字符串中间,则尝试失败。

为了它的价值,dialog使用getch读取UTF-8。请参阅inputstr.c,了解它在实践中的运作方式。

X / Open curses本身并没有这样做(对于实际使用UTF-8的Unix curses的罕见个人,没有指定的方法)。