在Windows上使用_vscwprintf处理UTF-8编码的字符串时失败,该如何解决?

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 - 蓝奏云

阅读 1.8k
1 个回答

vswprintf_s 的处理对象是 unicode 中的utf16编码,是跟 utf8 不同的,你需要先把 utf8 的字符串转换为 utf16 再调用 vswprintf_s 处理。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题