У меня следующий пример кода C ++:
void SetVaArgs(const char* fmt, const va_list argList)
{
setlocale( LC_ALL, "C" );
// 1
m_FormatBufferLen = ::_vsnprintf(m_FormatBuffer, Logger::MAX_LOGMESSAGE_SIZE, fmt, argList);
setlocale( LC_ALL, "" );
//2
m_FormatBufferLen = ::_vsnprintf(m_FormatBuffer, Logger::MAX_LOGMESSAGE_SIZE, fmt, argList);
_locale_t locale = _create_locale(LC_ALL, "C");;
//3
m_FormatBufferLen = ::_vsnprintf_l(m_FormatBuffer, Logger::MAX_LOGMESSAGE_SIZE, fmt,locale, argList);
В arglist содержится LPCTSTR с расширенными символами ascii. Команда // 1 копирует его в буфер, как и ожидалось. Команда // 2 прекращает копирование первого символа из диапазона 129-161 (там есть несколько исключений).
Я бы хотел решить эту проблему, не меняя глобальную локализацию процесса, но команда // 3 работает как // 2, почему? Я передаю "C" локаль, поэтому я ожидаю эффекта от команды //1.
По умолчанию я использую польский язык на английском языке Windows XP.