Re: Локаль по умолчанию.
От: okman Беларусь https://searchinform.ru/
Дата: 22.10.11 17:50
Оценка: 17 (2)
Здравствуйте, 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", и т.п.), так что данный код запросто может выкинуть исключение, будучи
скомпилированным в другом окружении.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.