Handling UTF-8 encoded strings between std::wstring and std::string

前端 未结 2 2005
难免孤独
难免孤独 2020-12-21 09:10

I am using two libraries one that stores UTF-8 strings in std::wstring and another stores strings ( UTF-8) in std::string.
What is the best / e

相关标签:
2条回答
  • 2020-12-21 09:27

    Consider ICU. It is portable and has a lot of converters between encodings

    0 讨论(0)
  • 2020-12-21 09:34

    Assuming you mean UTF-16 and not UTF-8 for std::wstring, you will have to encode/decode the strings from one library to the other. I'm not sure if/what the STL provides for that, but you can use Windows's own MultiByteToWideChar() and WideCharToMultiByte() functions to convert between UTF-8 and UTF-16 with just a few lines of code. You could then wrap that into your own functions so you can replace the logic when you find something more portable, eg:

    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;
    }
    
    0 讨论(0)
提交回复
热议问题