Здравствуйте, Went, Вы писали:
W>Здравствуйте. Есть ли какая-то строгая стандартизация того, какая локаль будет активна при старте приложения?
Стандартом гарантируется только одна локализация.
Это так называемая C-локализация — она использует ASCII-коды для символов и американские
стандарты написания денежных единиц, дат и тому подобного. Она же устанавливается при
запуске приложения. Реализовывать другие локализации стандарт не требует.
W>Ибо неожиданно для себя получил странное поведение. Винда 7-ка, русская, все настройки стоят русские (в "Языках и Региональных стандартах"). Создаю простейшее Win32-приложение, и выполняю такой код:
W>W>const char* ascii_str = "Привет, мир!";
W>wchar_t wide_str[64];
W>mbstowcs(wide_str, ascii_str, strlen(ascii_str));
W>
W>Так вот после этого в буфере wide_str оказываются кракозяблы, и видно, что при конвертации оно использовало CP1252, а не СP1251. Почему?
Потому что mbstowcs использует текущую локализацию, о чем и сказано в документации к этой функции.
Тот результат, который Вы хотите получить, достигается примерно так:
#include <iostream>
#include <locale>
int main()
{
std::locale Locale("russian");
std::locale::global(Locale);
char const *pString = "Привет, мир!";
wchar_t Buffer[64];
mbstowcs(Buffer, pString, strlen(pString) + 1);
std::wcout << Buffer << std::endl;
return 0;
}
// >Привет, мир!
Но учтите, что обеспечение локализаций для других языков и регионов стандартом не требуются и
даже их названия могут отличаться на разных компиляторах ("russian", "ru_RU",
"russian_RU.CP1251", и т.п.), так что данный код запросто может выкинуть исключение, будучи
скомпилированным в другом окружении.