static std::wstring format_string(CONST WCHAR* pszText, ...)
{
std::wstring result;
va_list args;
va_start(args, pszText);
int len = _vscwprintf(pszText, args);
if (len < 0)
{
wprintf_s(L"_vscwprintf failed, len=%i, error=%i\n", len, errno);
return L"";
}
result.resize((size_t)len);
vswprintf_s(const_cast<WCHAR*>(result.data()), result.size() + sizeof(WCHAR),
pszText, args);
va_end(args);
return result;
}
int wmain(int argc, wchar_t* argv[])
{
wprintf_s(L"%S\n", setlocale(LC_ALL, ".UTF8"));
std::wstring msg = format_string(L"msg: %hs", u8"abc你好");
wprintf_s(L"msg: %s\n", msg.c_str());
return 0;
}
输出:
Chinese (Simplified)_China.utf8
_vsctprintf failed, len=-1, error=0
msg:
操作系统:Windows 10 x64
编译器:vs2019, mingw-w64-v8.1.0
项目字符集:UNICODE
项目文件:test_utf8.zip - 蓝奏云
vswprintf_s 的处理对象是 unicode 中的utf16编码,是跟 utf8 不同的,你需要先把 utf8 的字符串转换为 utf16 再调用 vswprintf_s 处理。