在std :: wstring和std :: string之间处理UTF-8编码的字符串

use*_*425 3 c++ unicode utf-8

我正在使用两个库,一个存储UTF-8字符串std::wstring,另一个存储字符串(UTF-8)std::string.
我可以用来在两个库之间传递字符串的最佳/有效方法是什么.
我目前在Windows上使用Visual C++ v9 Express,但更喜欢便携式解决方案.

Rem*_*eau 5

假设您的意思是UTF-16而不是UTF-8 std::wstring,则必须将字符串从一个库编码/解码到另一个库.我不知道是否/什么STL提供了这一点,但你可以使用Windows自身MultiByteToWideChar()WideCharToMultiByte()功能只需几行代码UTF-8和UTF-16之间转换.然后,您可以将其包装到您自己的函数中,以便在找到更便携的东西时替换逻辑,例如:

std::wstring Utf8ToUtf16(const std::string &s)
{
    std::wstring ret;
    int len = MultiByteToWideChar(CP_UTF8, 0, s.c_str(), s.length(), NULL, 0);
    if (len > 0)
    {
      ret.resize(len);
      MultiByteToWideChar(CP_UTF8, 0, s.c_str(), s.length(), const_cast<wchar_t*>(ret.c_str()), len);
    }
    return ret;
}

std::string Utf16ToUtf8(const std::wstring &s)
{
    std::string ret;
    int len = WideCharToMultiByte(CP_UTF8, 0, s.c_str(), s.length(), NULL, 0, NULL, NULL);
    if (len > 0)
    {
      ret.resize(len);
      WideCharToMultiByte(CP_UTF8, 0, s.c_str(), s.length(), const_cast<char*>(ret.c_str()), len, NULL, NULL);
    }
    return ret;
}
Run Code Online (Sandbox Code Playgroud)