Обработка строк в кодировке UTF-8 между std :: wstring и std :: string - PullRequest
3 голосов
/ 28 июля 2011

Я использую две библиотеки, одна из которых хранит строки UTF-8 в std::wstring, а другая хранит строки (UTF-8) в std::string.
Какой наилучший / эффективный метод я могу использовать для передачи строк междудве библиотеки.
В настоящее время я использую Visual C ++ v9 Express для Windows, но предпочел бы переносимое решение.

Ответы [ 2 ]

5 голосов
/ 28 июля 2011

Предполагая, что вы имеете в виду 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;
}
1 голос
/ 28 июля 2011

Рассмотрим ICU .Это портативно и имеет много конвертеров между кодировками

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...