【发布时间】: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 上使用波兰语区域设置。
【问题讨论】: