在std :: string和std :: wstring之间转换的多平台方式

时间:2013-12-04 12:12:05

标签: c++ boost

我目前正在使用Windows API的MultiByteToWideCharWideCharToMultiByte方法在std::stringstd::wstring之间进行转换。

我是'多平台'我的代码删除了Windows依赖项,所以我想知道上面方法的替代方法。具体来说,使用 boost 会很棒。我可以使用哪种方法?这是我目前使用的代码:

const std::wstring Use::stow(const std::string& str)
{
    if (str.empty()) return L"";
    int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0);
    std::wstring wstrTo( size_needed, 0 );
    MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed);
    return wstrTo;
}

const std::string Use::wtos(const std::wstring& wstr)
{
    if (wstr.empty()) return "";
    int size_needed = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL);
    std::string strTo( size_needed, 0 );
    WideCharToMultiByte                  (CP_UTF8, 0, &wstr[0], (int)wstr.size(), &strTo[0], size_needed, NULL, NULL);
    return strTo;
}

3 个答案:

答案 0 :(得分:4)

基本上使用<cstdlib>,您可以使用类似的实现方式,as mentioned by Joachim Pileborg。只要您将语言环境设置为您想要的语言环境(例如:setlocale( LC_ALL, "en_US.utf8" );

MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0) =&gt; mbstowcs(nullptr, data(str), size(str))

MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed) =&gt; mbstowcs(data(wstrTo), data(str), size(str))

WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL) =&gt; wcstombs(nullptr, data(wstr), size(wstr))

WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), &strTo[0], size_needed, NULL, NULL) =&gt; wcstombs(data(strTo), data(wstr), size(wstr))

修改

requires strings to be allocated contiguously,如果您按照以前的标准编译跨平台,则 需要string连续分配,这可能很重要。之前调用&str[0]&strTo[0]&wstr[0]&wstrTo[0]可能会导致问题。
由于现在已被接受为标准,因此我改进了建议的替换以使用data,而不是取消引用字符串的前面。

答案 1 :(得分:0)

从您的代码中看起来您使用的是utf-8编码。要使用utf-8,请查看http://utfcpp.sourceforge.net/处的UTF8-CPP,这是一个仅标题库

查看utf8to32函数。 (请注意,在Windows上,wchar_t是16位,在其他平台上,例如linux,通常是32位)

答案 2 :(得分:-1)

const std::wstring Use::stow(const std::string &s)
{
    return std::wstring(s.begin(), s.end());
}

const std::string Use::wtos(const std::wstring &ws)
{
    return std::string(ws.begin(), ws.end());
}