C语言中带有重音字符的isLetter

C语言中带有重音字符的isLetter,c,testing,char,diacritics,letter,C,Testing,Char,Diacritics,Letter,我想创建(或查找)一个C函数来检查字符C是否是字母。。。 当然,我可以很容易地为a-z和a-z做到这一点 然而,如果测试c==á,ã,ô,ë等,我会得到一个错误 可能这些特殊字符存储在一个字符中 我想知道: 这些特殊字符是如何存储的,函数需要接收哪些参数,以及如何接收? 我还想知道是否有任何标准函数已经做到了这一点。我想您正在寻找iswalpha()例程: #include <wctype.h> int iswalpha(wint_t wc); DESCRIPTION

我想创建(或查找)一个C函数来检查字符C是否是字母。。。 当然,我可以很容易地为a-z和a-z做到这一点

然而,如果测试c==á,ã,ô,ë等,我会得到一个错误

可能这些特殊字符存储在一个字符中

我想知道: 这些特殊字符是如何存储的,函数需要接收哪些参数,以及如何接收?
我还想知道是否有任何标准函数已经做到了这一点。

我想您正在寻找
iswalpha()
例程:

   #include <wctype.h>

   int iswalpha(wint_t wc);

DESCRIPTION
   The iswalpha() function is the wide-character equivalent of
   the isalpha(3) function.  It tests whether wc is a wide
   character belonging to the wide-character class "alpha".
#包括
伊斯瓦尔法国际酒店(温特西城);
描述
函数的宽字符等效于
isalpha(3)函数。它测试wc是否是一个宽的
属于宽字符类“alpha”的字符。

它确实取决于当前
区域设置(7)
LC\u CTYPE
,因此在一个本应同时正确处理多种类型输入的程序中使用它可能并不理想。

这些字符的存储方式取决于区域设置。在大多数UNIX系统上,它们将存储为UTF8,而Win32机器可能将它们表示为UTF16。UTF8存储为可变数量的字符,而UTF16使用代理项对存储,因此在wchar_t(或无符号短字符)中(顺便说一句,Windows上的sizeof(wchar_t)仅为2(而*nix上为4),因此,如果使用代理项对编码,通常需要2个wchar_t类型来存储1个字符(在许多情况下都是这样)


如前所述,
iswalpha()
例程将为您执行此操作,并有文档记录。它应该为您解决特定于语言环境的问题。

您可能需要。它提供了一个带有API的可移植库。

如果您正在使用单字节代码集,如ISO 8859-1或8859-15(或任何其他8859-x代码集),那么如果您还记得使用
setlocale(LC_ALL,”),则
isalpha()
函数将完成此工作(或在程序中调用
setlocale()
)。如果不这样做,程序将在C语言环境中运行,该语言环境仅对ASCII字符(0x00..0x7F范围内的8859-x字符)进行分类


如果使用多字节或宽字符代码集(如UTF8或UTF16),则需要查看
中的宽字符函数

不,这是不正确的,UTF16也是可变长度的。只是每个代码点是16位,而不是UTF8中的8位。是的,但是每个字符只需要一种wchar\u t类型。哦,事实上,除非你在一台Windows机器上,它将数据存储为16位而不是32位。是的,你是对的。尼特:你很少需要两个wchar\u t,也不经常。ISO 8859-1将是完美的。根据你的说法,这是一个单字节。那么我需要将像‘ç’或‘á’这样的字符声明为wchar__t还是我可以使用字符?还有…如何使用setlocale()来使用ISO 8859-1?另外,如果我可以使用char,我如何解释一个包含“á”的char变量?我很抱歉问了这么多问题,但我对这个话题很不熟悉;gcc告诉我:main.c:9:11:警告:多字符常量main.c:在函数“main”中:main.c:9:警告:隐式常量中溢出conversion@joxnas:您对LANG、LC\u ALL、LC\u CTYPE有哪些环境设置?您使用的是哪种终端仿真器?它的代码集是什么?编译器警告使它听起来像是有一个UTF-8终端仿真器——这在当今并不少见。这在很大程度上取决于您使用的C库。locale命令提供了以下信息:LANG=en_US.utf8;LC_CTYPE=“en_US.utf8”;LC_ALL=“”;终端模拟器是GNOME terminal 2.30.2。菜单栏中有一个选项可以将编码设置为ISO 8859-1,在gvim(我使用的编辑器)中还有:set fileencoding命令。我尝试在vim中将文件编码设置为latin1(ISO 8859-1),并将
char o='ç'现在工作正常。然而,为了正确地将重音字符从输入(getchar)读入1字节字符,我还需要在终端中设置编码。setlocale()允许我在程序中控制它吗?@joxnas:No,
setlocale()
不控制终端属性。很可能有一种方法可以通过编程来实现,但它需要一些手动攻击——很可能是非常广泛的手动攻击。