Локали и std::toupper
От: tdiff  
Дата: 03.04.15 13:30
Оценка: 5 (1)
Объясните, пожалуйста, как работают локали. Пример:

#include <string>
#include <locale>

std::wstring upper(const std::wstring& s, const std::locale& loc)
{
    std::wstring result;
    for (auto& ch : s)
    {
        result.push_back(std::toupper(ch, loc));
    }
    return result;
}

int main()
{
    std::wstring t = L"привет!", T;

    T = upper(t, std::locale()); // С locale
    T = upper(t, std::locale("")); // Russian_Russia.1251

    return 0;
}


Выполняю программу на Винде, в ней настроено "русское" расположение.

Вопрос в том, что в обоих случаях T имеет нормальное значение ("ПРИВЕТ!"), хотя, в первом случае, я вызываю std::toupper с C-локалью, в которой не должно быть правил для перевода русских символов в юникоде, а во втором случае — с локалью Russian_Russia.1251, название которой намекает на использование cp1251, которая в свою очередь тоже не может заниматься изменением регистра юникодных символов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.