C Linux,field_缓冲区不提供UTF-8字符串

C Linux,field_缓冲区不提供UTF-8字符串,c,arrays,linux,string,utf-8,C,Arrays,Linux,String,Utf 8,在使用ncursesw和form的Linux C程序中,我需要读取存储在字段中的字符串,并支持UTF-8字符。当仅使用ASCII时,它非常简单,因为字符串存储为字符数组: 如果我尝试用此代码在字段中键入UTF-8和非ASCII字符,字符不会出现,也不会被处理。针对UTF-8,建议使用ncursesw。但是使用下面编写的代码 如何从字段中获取wchar\t数组? ncursesw使用get_wch代替getch,那么它使用哪个函数代替field_buffer呢?我无法通过谷歌搜索找到它。该程序是在

在使用ncursesw和form的Linux C程序中,我需要读取存储在字段中的字符串,并支持UTF-8字符。当仅使用ASCII时,它非常简单,因为字符串存储为字符数组:

如果我尝试用此代码在字段中键入UTF-8和非ASCII字符,字符不会出现,也不会被处理。针对UTF-8,建议使用ncursesw。但是使用下面编写的代码

如何从字段中获取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字符保存到字符数组中。 为了正确设置ncursesw,遵循的所有步骤非常重要。特别是,程序应该有标题

#define _XOPEN_SOURCE_EXTENDED
#include <ncursesw/form.h>
#include <stdio.h>
#include <locale.h>
程序应该包含

setlocale(LC_ALL, "");

在initscr;之前;。满足所有这些条件后,可以将字符串保存到正常的字符数组中,就好像使用了ncurses和ASCII而不是ncursesw和UTF-8一样。正如John Bollinger在注释中指定的那样,函数字段\u buffer只能返回一个char*,因此使用任何其他数据类型(如wchar\u t)都是无用的。

@LP,wchar\u t可以是UTF-16,但决不需要。它的宽度可以小于或大于16位,其中隐含的字符编码未指定。然而,在C2011中,有char16_t,通常是UTF-16。您可以根据是否定义了宏来判断char16\t。@BowPark,ncursesw库是ncurses的扩展版本。它没有重新定义现有的函数,这会造成多大的混乱!,相反,它提供了旨在支持多字节字符的附加函数。@BowPark,据我所知或所知,没有任何版本的field_u例程可以处理或返回wchar_ut。据我所知,在开始使用ncurses函数之前,需要使用setlocale。选择一个支持Unicode并使用UTF-8编码的区域设置,普通的field_uu例程应该可以工作——至少对于宽字符来说,它们可以工作得很好。这里有一些一般建议:@BowPark,field\u buffer返回一个char*。这就是你使用它的原因。如果您设置了适当的区域设置,那么通过这种方式获得的缓冲区应该用UTF-8编码。在某种程度上,当您使用系统的默认区域设置时,这应该是透明的。@BowPark,我没有比我之前给您的roguebasin链接提供的更好的建议了。问题可能是语言环境、控制台程序、控制台字体,甚至是数据。它可能是您正在链接的ncurses库。可能还有其他的可能性。我可以自信地告诉您,field\u buffer返回char*,而不是wchar\u t*,在适当的条件下,您可以将ncursesw与多字节字符一起使用,ncurses取决于语言环境来确定如何处理字符,如果语言环境如此指示,它将与UTF-8一起工作。
$ 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=
#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, "");