10

使用 wchar_t 的 isalpha 或 isalnum 的等效函数是什么?

wctype ?

一个例子也很好

谢谢

4

6 回答 6

13

iswalpha, iswalnum. 用法相同。

于 2010-07-31T13:47:43.717 回答
3

您在问题中包含标签“本地化”。在撰写国际申请的情况下,您应该清楚地定义字母或数字字符下的含义。如果您为 Windows 编写程序,我建议您使用GetStringTypeEx函数(请参阅http://msdn.microsoft.com/en-us/library/dd318118.aspx)。例如代码

BOOL bSuccess;
int isTrue;
WORD wCharType;

bSuccess = GetStringTypeExW (LOCALE_USER_DEFAULT, CT_CTYPE1, L"a", 1, &wCharType);
if (wCharType & C1_ALPHA == C1_ALPHA) {
    // 
}

您还可以使用CT_CTYPE3orCT_CTYPE2来确定一个字符是表意文字还是欧洲数字。

更准确地说,只需尝试使用 function iswalpha, IsCharAlphaW, iswalnum,iswdigitGetStringTypeExW测试以下字符:L'a', L'ü', L'á', L'я' (俄罗斯字符), L'ノ' (日本字符 in片假名),L'一'(日语中的1)。你会看到

  • iswalpha (L'ノ') 返回 alpha
  • IsCharAlphaW (L'ノ') 返回 NOT alpha
  • iswalnum (L'一') 返回字母或数字
  • iswdigit (L'一') 返回非数字

编码

bSuccess = GetStringTypeExW (LOCALE_USER_DEFAULT, CT_CTYPE2, L"一", 1, &wCharType);
if ((wCharType & C2_EUROPENUMBER) == wCharType) {
    // numeric
}

说你L“一”不是欧洲数字。您可以使用GetStringTypeExW例如阿拉伯数字等来确定欧洲数字。

因此,我建议您更准确地指定您的需求,然后根据需求选择 API。一般来说,使用 C API 并不是国际应用程序的最佳方式。

于 2010-08-01T16:49:04.997 回答
3

看看std::isaplha<charT><locale>。可以将其用作std::isalpha<wchar_t>.

于 2010-07-31T13:58:21.070 回答
1

这取决于您如何定义“等效”。与 Unicode 字符类相比,C 字符类非常简单。例如,如果您想测试给定的代码点是否通常代表一个字母(对于“字母”的某些定义),您可以测试一般类别L;如果您想检查给定的字符串是否包含有效的标识符,您可以使用UAX #31iswalnum,并且iswalpha可能会根据当前的“区域设置”设置给出预期的结果。

于 2010-08-01T13:57:29.590 回答
1

严格来说,这在 Visual Studio/Windows 下是不可能的,因为 wchar_t 在这个平台上是 2 个字节,无法容纳一个 unicode 代码点。

你真正需要的是一个接受 char* 的函数。你有一个在ICU AFAIK。

另请参阅https://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful

于 2010-08-23T09:10:17.927 回答
0

标题是<wctype.h>. 基本的宏/函数名称中有一个“w”:

int iswalpha(wint_t wc);
int iswalnum(wint_t wc);

等等。

还有以下功能:

wctype_t wctype(const char *property);
int iswctype(wint_t wc, wctype_t desc);

你可以写,例如:

if (iswctype(wc, wctype("alnum")))
    ...process a wide alphanumeric...

或者你可以简单地写:

if (iswalnum(wc))
    ...process a wide alphanumeric...
于 2010-07-31T13:50:20.210 回答