isalpha, эквивалентный для wchar_t

какова эквивалентная функция для isalpha или isalnum, использующего wchar_t?

wctype?

пример был бы хорош также

спасибо

9
задан lj8888 31 July 2010 в 13:43
поделиться

6 ответов

Это зависит от того, как вы определяете «эквивалент». Классы символов C довольно просты по сравнению с классами символов Unicode. Например, если вы хотите проверить, представляет ли данная кодовая точка обычно букву (для некоторого определения «буквы»), вы можете проверить общую категорию L ; если вы хотите проверить, содержит ли данная строка допустимый идентификатор, вы можете использовать UAX # 31 и т. д. iswalnum и iswalpha могут дать желаемый результат в зависимости от на текущей настройке «локали».

1
ответ дан 4 December 2019 в 11:03
поделиться

iswalpha, iswalnum. То же самое использование.


Docs - Windows (msdn)

Docs - Linux (opengroup.org)

12
ответ дан 4 December 2019 в 11:03
поделиться

Взгляните на std :: isaplha из . Можно использовать это как std :: isalpha .

2
ответ дан 4 December 2019 в 11:03
поделиться

Вы включили тег "локализация" в свой вопрос. В случае написания международного приложения вы должны четко определить, что вы подразумеваете под алфавитными или цифровыми символами. Если вы пишете программы для 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 в японском языке). Вы увидите, что

  • iswalpha (L'ノ') return alpha
  • IsCharAlphaW (L'ノ') return NOT alpha
  • iswalnum (L'一') return alpha or digit
  • iswdigit (L'一') return NOT digit

Код

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

говорит вам, что L'一' НЕ является европейским числом. Вы можете использовать GetStringTypeExW, чтобы отличить европейское число от, например, арабского и т.д.

Поэтому я рекомендую вам более точно определить ваши требования, а затем выбрать API на основе этих требований. В целом, использование C API - не лучший способ для международного приложения.

3
ответ дан 4 December 2019 в 11:03
поделиться

Заголовок - . Основные имена макросов/функций содержат '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...
0
ответ дан 4 December 2019 в 11:03
поделиться

Строго говоря, это невозможно в Visual Studio / Windows, потому что wchar_t составляет 2 байта на этой платформе и не может содержать кодовую точку Unicode.

Что вам действительно нужно, так это функция, принимающая char *. У вас есть один в ICU AFAIK.

См. Также https://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful

1
ответ дан 4 December 2019 в 11:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: