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

标签 c++ boost

我目前正在使用 Windows API 的方法 MultiByteToWideCharWideCharToMultiBytestd::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))

编辑:

requires strings to be allocated contiguously ,如果您正在编译跨平台,这可能很重要,因为以前的标准要求string连续分配。之前调用 &str[0] , &strTo[0] , &wstr[0] , 或 &wstrTo[0]可能会导致问题。
现在是公认的标准,我改进了建议的替代品以使用 data 而不是取消引用字符串的前面。

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

相关文章:

c++ - Boost C++ 库链接器错误 libboost_serialization-vc100-mt-gd-1_47.lib

c++ - 使用自定义删除器 boost scoped_ptr/scoped_array

C++ 服务器收到太多请求,我想一次接受一些请求

c++ - 如何修改/更新由 const 引用传递的对象的内部状态

c++ - 使用 C++,我在创建类时得到 0xcdcdcdcd 指针——发生了什么?

C++ boost 图 : how to add_vertex via iteration

c++ - 嵌套类 C++ 的正确模板

c++ - 使用 128 位精度的 Lapack

c++ - 跨平台 unicode 路径处理

c++ - 我可以使用 std::shared_ptr 而不是 boost::shared_ptr 构建 boost 库吗