我目前正在使用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;
}

最佳答案

基本上使用<cstdlib>,您可以得到与已有的as mentioned by Joachim Pileborg类似的实现。只要将语言环境设置为所需的任何语言环境(例如:setlocale( LC_ALL, "en_US.utf8" );MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0) => mbstowcs(nullptr, data(str), size(str))MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed) => mbstowcs(data(wstrTo), data(str), size(str))WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL) => wcstombs(nullptr, data(wstr), size(wstr))WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), &strTo[0], size_needed, NULL, NULL) => wcstombs(data(strTo), data(wstr), size(wstr))
编辑:

c++11 requires strings to be allocated contiguously,如果您正在跨平台编译,这可能很重要,因为以前的标准不需要string连续分配。以前调用&str[0]&strTo[0]&wstr[0]&wstrTo[0]可能会引起问题。
由于c++17现在已成为公认的标准,因此我对建议的替代方法进行了改进,以使用 data 而不是取消对字符串开头的引用。

关于c++ - 在std::string和std::wstring之间转换的多平台方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20375049/

10-10 13:45