isalpha相当于wchar_t

时间:2010-07-31 13:43:11

标签: c++ unicode localization wchar-t

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

wctype?

一个例子也不错

感谢

6 个答案:

答案 0 :(得分:12)

iswalphaiswalnum。相同的用法。


文档 - Windows(msdn)

Docs - Linux(opengroup.org)

答案 1 :(得分: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_CTYPE3CT_CTYPE2来确定字符集是表意文字还是欧洲字母。

更准确地说,只需尝试使用函数iswalphaIsCharAlphaWiswalnumiswdigitGetStringTypeExW来测试以下字符:L'a' ,L'ü',L'á',L'я'(俄罗斯charackter),L'ノ'(日本chaakckter in Katakana),L'a''(日语1)。你会看到

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

代码

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

你说L“一”不是欧洲号码。您可以使用GetStringTypeExW来驱逐欧洲号码,例如阿拉伯语号码等。

因此,我建议您更准确地指定您的要求,然后根据要求选择API。通常,C API的使用不是国际申请的最佳方式。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

这取决于你如何定义“等价物”。与Unicode字符类相比,C字符类非常简单。例如,如果要测试给定代码点是否通常表示字母(对于“字母”的某些定义),则可以测试常规类别L;如果要检查给定字符串是否包含有效标识符,可以使用UAX #31等。iswalnumiswalpha可能会根据当前“区域设置”设置提供预期结果。

答案 4 :(得分:1)

严格地说,在visual studio / windows下这是不可能的,因为wchar_t在这个平台上是2个字节,并且无法保存unicode代码点。

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

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

答案 5 :(得分: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...