Есть ли iswalnum без привязки к локали.
От: Went  
Дата: 12.01.21 15:19
Оценка:
Здравствуйте. Необходимо ограничить ввод пользователя только буквами и цифрами (на вход идут UTF-16 символы).
Раньше использовал iswalnum и все было хорошо. Но внезапно обнаружил, что на MacOSX эта функция перестала пропускать русские буквы. Почитал документацию — якобы, поведение зависит от текущей локали. И можно сделать так:
int main()
{
    wchar_t c = L'\u13ad'; // the Cherokee letter HA ('Ꭽ')
 
    std::cout << std::hex << std::showbase << std::boolalpha;
    std::cout << "in the default locale, iswalnum(" << (std::wint_t)c << ") = "
              << (bool)std::iswalnum(c) << '\n';
    std::setlocale(LC_ALL, "en_US.utf8");
    std::cout << "in Unicode locale, iswalnum(" << (std::wint_t)c << ") = "
              << (bool)std::iswalnum(c) << '\n';
}

и все заработает.
Не заработало. Во-первых, мне не хочется переключать локаль в иную, чем стоит по умолчанию, во-вторых, даже с указанием локали "en_US.utf8" русские буквы ей все равно не нравятся (я вижу, что там en, но и "ru_RU.utf8" тоже не имеет эффекта). Да и при чем тут локаль, строго говоря? Мне просто нужно узнать класс символа, который однозначно определяется этими двумя байтами (про экзотику не будем), и символ "ъ" будет буквой хоть в Испании, хоть в Китае.
Или это глюк маковской стандартной библиотеки?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.