isLetter,带有C中的重音字符

时间:2011-04-09 12:02:16

标签: c testing char diacritics letter

我想创建(或找到)一个C函数来检查char c是否是一个字母... 我当然可以轻松地为a-z和A-Z做这个。

然而,如果测试c ==á,ã,ô,ç,ë等,我会收到错误

这些特殊字符可能存储在一个以上的字符......

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

4 个答案:

答案 0 :(得分:4)

我认为你正在寻找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".

它取决于当前LC_CTYPE的{​​{1}},因此它在一个应该同时正确处理多种类型输入的程序中的使用可能并不理想。

答案 1 :(得分:3)

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

如果您正在处理多字节或宽字符代码集(例如UTF8或UTF16),那么您需要查看<wchar.h><wctype.h>中的宽字符函数。

答案 2 :(得分:1)

你可能想要http://site.icu-project.org/。它为此提供了一个带有API的可移植库。

答案 3 :(得分:0)

如何存储这些字符取决于区域设置。在大多数UNIX系统上,它们将被存储为UTF8,而Win32机器可能将它们表示为UTF16。 UTF8存储为可变数量的字符,而UTF16使用代理项对存储 - 因此在wchar_t(或无符号短字)内部存在(尽管偶然地,Windows上的sizeof(wchar_t)仅为2(vs * on * nix),因此,如果使用代理对编码,你通常需要2个wchar_t类型来存储1个字符 - 在许多情况下它将会存在。

如上所述,iswalpha()例程将为您执行此操作,并记录在案here。它应该为您处理特定于语言环境的问题。