Объясните, пожалуйста, как работают локали. Пример:
#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, которая в свою очередь тоже не может заниматься изменением регистра юникодных символов.