在 Linux 的 C 程序中,使用 ncursesw
和 form
,我需要读取存储在 field
中的字符串,并支持UTF-8 字符。当仅使用 ASCII 时,非常简单,因为字符串存储为 char
数组:
char *dest;
...
dest = field_buffer(field[0], 0);
如果我尝试使用此代码在字段中键入 UTF-8 和非 ASCII 字符,则该字符不会出现并且不会被处理。在 this对于 UTF-8 的回答,建议使用 ncursesw。但是用下面的代码(写在 this guide 后面)
#define _XOPEN_SOURCE_EXTENDED
#include <ncursesw/form.h>
#include <locale.h>
int main()
{
...
setlocale(LC_ALL, "");
...
initscr();
wchar_t *dest;
...
dest = field_buffer(field[0], 0);
}
编译器产生错误:
warning: assignment from incompatible pointer type [enabled by default]
dest = field_buffer(field[0], 0);
^
如何从字段中获取wchar_t
数组?
ncursesw
使用 get_wch
而不是 getch
,那么它使用哪个函数而不是 field_buffer()
呢?我通过谷歌搜索找不到它。
最佳答案
程序在具有以下语言环境的系统中编译:
$ locale
LANG=it_IT.UTF-8
LANGUAGE=
LC_CTYPE="it_IT.UTF-8"
LC_NUMERIC="it_IT.UTF-8"
LC_TIME="it_IT.UTF-8"
LC_COLLATE="it_IT.UTF-8"
LC_MONETARY="it_IT.UTF-8"
LC_MESSAGES="it_IT.UTF-8"
LC_PAPER="it_IT.UTF-8"
LC_NAME="it_IT.UTF-8"
LC_ADDRESS="it_IT.UTF-8"
LC_TELEPHONE="it_IT.UTF-8"
LC_MEASUREMENT="it_IT.UTF-8"
LC_IDENTIFICATION="it_IT.UTF-8"
LC_ALL=
它默认支持并使用 UTF-8
。对于这样的语言环境,当使用 ncursesw
环境时,C 程序应该能够将 UTF-8
字符保存到 char
数组中。
为了正确设置 ncursesw
,遵循 mentioned guide 中的所有步骤非常重要。 。特别是,程序应该有标题
#define _XOPEN_SOURCE_EXTENDED
#include <ncursesw/form.h>
#include <stdio.h>
#include <locale.h>
程序应编译为
gcc -o executable_file source_file.c -lncursesw -lformw
并且该程序应包含
setlocale(LC_ALL, "");
之前 initscr();
。满足所有这些条件后,字符串可以保存到普通的 char
数组中,就好像使用 ncurses
和 ASCII 代替 ncursesw
和 UTF-8
。正如 John Bollinger 在注释中所指出的,函数 field_buffer
只能返回 char *
,因此使用任何其他数据类型(例如 wchar_t<)是没有用的。/
.
关于c - Linux,field_buffer不提供UTF-8字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32888615/