какова эквивалентная функция для isalpha или isalnum, использующего wchar_t?
wctype?
пример был бы хорош также
спасибо
Это зависит от того, как вы определяете «эквивалент». Классы символов C довольно просты по сравнению с классами символов Unicode. Например, если вы хотите проверить, представляет ли данная кодовая точка обычно букву (для некоторого определения «буквы»), вы можете проверить общую категорию L
; если вы хотите проверить, содержит ли данная строка допустимый идентификатор, вы можете использовать UAX # 31 и т. д. iswalnum
и iswalpha
могут дать желаемый результат в зависимости от на текущей настройке «локали».
iswalpha
, iswalnum
. То же самое использование.
Взгляните на std :: isaplha
из
. Можно использовать это как std :: isalpha
.
Вы включили тег "локализация" в свой вопрос. В случае написания международного приложения вы должны четко определить, что вы подразумеваете под алфавитными или цифровыми символами. Если вы пишете программы для 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
или CT_CTYPE2
, чтобы определить, является ли символ идеографическим или это европейское число.
Чтобы быть более точным, попробуйте использовать функции iswalpha
, IsCharAlphaW
, iswalnum
, iswdigit
и GetStringTypeExW
для проверки следующих символов: L'a', L'ü', L'á', L'я' (русский алфавит), L'ノ' (японский алфавит в Катакане), L'一' (1 в японском языке). Вы увидите, что
Код
bSuccess = GetStringTypeExW (LOCALE_USER_DEFAULT, CT_CTYPE2, L"一", 1, &wCharType);
if ((wCharType & C2_EUROPENUMBER) == wCharType) {
// numeric
}
говорит вам, что L'一' НЕ является европейским числом. Вы можете использовать GetStringTypeExW
, чтобы отличить европейское число от, например, арабского и т.д.
Поэтому я рекомендую вам более точно определить ваши требования, а затем выбрать API на основе этих требований. В целом, использование C API - не лучший способ для международного приложения.
Заголовок -
. Основные имена макросов/функций содержат '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...
Строго говоря, это невозможно в Visual Studio / Windows, потому что wchar_t составляет 2 байта на этой платформе и не может содержать кодовую точку Unicode.
Что вам действительно нужно, так это функция, принимающая char *. У вас есть один в ICU AFAIK.
См. Также https://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful