c++ - 考虑到所有可能的编码,是否有将 wstring 转换为 std::string 的通用方法?

标签 c++ windows unicode character-encoding

我正在使用以下 api 将 wstring 编码为字符串,

string utf8_encode(const std::wstring &wstr) 
{ 
    int len = WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, 0, 0, 0, 0);
    vector<char> buf(len);
    WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, &buf[0], len, 0, 0);
    return std::string(buf.begin(), buf.end());
}

只要在系统语言环境为 Windows 的机器上执行,这种编码就可以正常工作

英语。

现在,如果我尝试在日文窗口中使用它,转换后的字符串就会损坏。我的理解是,日语窗口使用 Shift-JIS 编码。 如果我修改 API 以将代码页作为参数,那么它就可以工作。

string utf8_encode(const std::wstring &wstr)
{
    UINT codePage = GetACP();
    int len = WideCharToMultiByte(codePage, 0, wstr.c_str(), -1, 0, 0, 0, 0);
    vector<char> buf(len);
    WideCharToMultiByte(codePage, 0, wstr.c_str(), -1, &buf[0], len, 0, 0);
    return std::string(buf.begin(), buf.end());
}

但是如果我在默认系统区域设置为英语的 Windows 机器上使用日文或中文字符,它又会失败。基本上我必须使用 CP_UTF8 进行转换。如果我必须支持以下代码页怎么办?

http://msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).aspx

考虑到所有可能的编码,是否有任何通用的方法将 wstring 转换为 string?

最佳答案

没有。 std::string 的许多编码仅涵盖 wstring 字符集的一个子集。例如。 ISO-8859-1 和 Unicode 的常见选择意味着大多数 wchar_t 值没有 char 等价物。例如,ISO-8859-1 中就没有 sa。

关于c++ - 考虑到所有可能的编码,是否有将 wstring 转换为 std::string 的通用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15287001/

相关文章:

c++ - 使用 GCC,我可以在每个函数的基础上禁用 -Wframe-larger-than 吗?

c++ - 根据参数创建派生类的新实例

c# - 无法读取 C# 中的 UNICODE URL

c++ - 使用C++执行脚本

c++ - 打印文本导致内存问题

windows - 将文件复制到所有文件夹批处理文件?

windows - 在 Windows 下以访客身份或以有限权限运行应用程序而无需重新登录?

windows - 访问 nginx 后面的 Windows Admin Center

Python 使用 euc-kr 编码以意想不到的方式对(韩语)字符进行编码(编解码器、编码模块)

php - PHP 和 MySQL 中的 unicode 字符问题