在使用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'或使用与上面相同的命令进行编译
答案 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的罕见个人,没有指定的方法)。