使用 wchar_t 的 isalpha 或 isalnum 的等效函数是什么?
wctype ?
一个例子也很好
谢谢
您在问题中包含标签“本地化”。在撰写国际申请的情况下,您应该清楚地定义字母或数字字符下的含义。如果您为 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_CTYPE3
orCT_CTYPE2
来确定一个字符是表意文字还是欧洲数字。
更准确地说,只需尝试使用 function iswalpha
, IsCharAlphaW
, iswalnum
,iswdigit
并GetStringTypeExW
测试以下字符:L'a', L'ü', L'á', L'я' (俄罗斯字符), L'ノ' (日本字符 in片假名),L'一'(日语中的1)。你会看到
编码
bSuccess = GetStringTypeExW (LOCALE_USER_DEFAULT, CT_CTYPE2, L"一", 1, &wCharType);
if ((wCharType & C2_EUROPENUMBER) == wCharType) {
// numeric
}
说你L“一”不是欧洲数字。您可以使用GetStringTypeExW
例如阿拉伯数字等来确定欧洲数字。
因此,我建议您更准确地指定您的需求,然后根据需求选择 API。一般来说,使用 C API 并不是国际应用程序的最佳方式。
看看std::isaplha<charT>
从<locale>
。可以将其用作std::isalpha<wchar_t>
.
这取决于您如何定义“等效”。与 Unicode 字符类相比,C 字符类非常简单。例如,如果您想测试给定的代码点是否通常代表一个字母(对于“字母”的某些定义),您可以测试一般类别L
;如果您想检查给定的字符串是否包含有效的标识符,您可以使用UAX #31等iswalnum
,并且iswalpha
可能会根据当前的“区域设置”设置给出预期的结果。
严格来说,这在 Visual Studio/Windows 下是不可能的,因为 wchar_t 在这个平台上是 2 个字节,无法容纳一个 unicode 代码点。
你真正需要的是一个接受 char* 的函数。你有一个在ICU AFAIK。
另请参阅https://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful
标题是<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...