C ++ - работает глобальная setlocale, та же локаль, переданная _vsnprintf_l, не работает - PullRequest
0 голосов
/ 05 января 2010

У меня следующий пример кода 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.

1 Ответ

3 голосов
/ 06 января 2010

Оказалось, что это ошибка CRT в VS2005 и выше (2008 и 2010). Отправлено в Microsoft здесь: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=523503#details

Ошибка относится к _sprintf_l, _vsnprintf_l, _sprintf_s_l, _vsnprintf_s_l и, возможно, к другим родственникам.

...