3

我想创建(或查找)一个 C 函数来检查 char c 是否是字母……当然,我可以轻松地为 az 和 AZ 执行此操作。

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

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

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

4

4 回答 4

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_CTYPEcurrent locale(7),因此它在应该同时正确处理多种类型的输入的程序中的使用可能并不理想。

于 2011-04-09T12:08:23.100 回答
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>

于 2011-04-09T13:15:04.973 回答
1

这些字符的存储方式取决于语言环境。在大多数 UNIX 系统上,它们将存储为 UTF8,而 Win32 机器可能会将它们表示为 UTF16。UTF8 存储为可变数量的字符,而 UTF16 使用代理对存储 - 因此在 wchar_t(或 unsigned short)内(尽管顺便说一下,Windows 上的 sizeof(wchar_t) 仅为 2(而 *nix 上为 4),因此,如果使用代理对编码,您通常需要 2 个 wchar_t 类型来存储 1 个字符 - 在许多情况下都是如此)。

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

于 2011-04-09T12:15:10.850 回答
1

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

于 2011-04-09T12:43:46.747 回答