Исальфа эквивалент для wchar_t - PullRequest
9 голосов
/ 31 июля 2010

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

wctype?

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

спасибо

Ответы [ 6 ]

12 голосов
/ 31 июля 2010

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


Документы - Windows (msdn)

Документы - Linux (opengroup.org)

3 голосов
/ 01 августа 2010

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

2 голосов
/ 31 июля 2010

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

1 голос
/ 23 августа 2010

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

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

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

1 голос
/ 01 августа 2010

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

0 голосов
/ 31 июля 2010

Заголовок <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...
...