在我用ncurses开发的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?或者还有另一个函数吗?
附注:如果您测试源代码,请链接 '-lncursesw',而不是'-lncurses',或者使用与上面相同的命令进行编译。
getch
返回一个转换为int
的单个字节,但是一个字符可能占据多个字节。因此,您需要多次调用getch()
来读取单个 Unicode 字符。 - n. m.