0

我正在使用以下 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 转换为字符串?

4

1 回答 1

1

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

于 2013-03-08T07:39:29.280 回答