【问题标题】:C++ - global setlocale works, the same locale passed to _vsnprintf_l doesn'tC++ - 全局 setlocale 有效,传递给 _vsnprintf_l 的相同语言环境无效
【发布时间】:2010-01-05 09:14:11
【问题描述】:

我有以下 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 包含带有扩展 ascii 字符的 LPCTSTR。命令 //1 按预期将其复制到缓冲区。命令 //2 在 129-161 范围内的第一个字符处停止复制(那里很少有例外)。

我想在不更改进程的全局语言环境的情况下解决这个问题,但命令 //3 的工作方式与 //2 一样,为什么?我正在传递“C”语言环境,所以我希望命令 //1 的效果。

默认情况下,我在英语 Windows XP 上使用波兰语区域设置。

【问题讨论】:

    标签: c++ c locale printf


    【解决方案1】:

    原来是 VS2005 及更高版本(2008 和 2010)中的 CRT 错误。在这里提交给微软:https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=523503#details

    Bug 适用于 _sprintf_l、_vsnprintf_l、_sprintf_s_l、_vsnprintf_s_l 和可能的其他亲属。

    【讨论】:

      猜你喜欢
      • 2021-08-06
      • 2019-08-10
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-09
      相关资源
      最近更新 更多