• 本站由于前段时间遭受到大量临时和国外邮箱注册,所以对可注册的邮箱类型进行了限制!

  • 欢迎大家交换友链,可在https://www.stubbornhuang.com/申请友情链接进行友链交换申请!

  • 本站会放置Google广告用于维持域名以及网站服务器费用。

  • 感谢大家访问本站,希望本站的内容可以帮助到大家!

  • 如果觉得本站的内容有帮助,可以考虑打赏博主哦!

  • 问题反馈可发送邮件到stubbornhuang@qq.com

  • 计算机图形学与计算几何经典必备书单整理,下载链接可参考:https://www.stubbornhuang.com/1256/

  • 在本站开通年度VIP,无限制下载本站资源和阅读本站文章

  • 工资「喂饱肚子」,副业「养活灵魂」!

C++ – std::string与std::wstring相互转换

C++ 发布于2021-08-20 阅读 7,036次 0次评论 0次点赞 本文共3304个字,阅读需要9分钟。

1 std::stringstd::wstring相互转换

1.1 windows上的std::string与std::wstring相互转换

在Windows上,可以使用MultiByteToWideChar和WideCharToMultiByte函数来进行std::string和std::wstring之间的转换,代码如下

std::wstring StringToWString(const std::string& str)
{
    int wide_str_size = MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
    std::wstring wide_str(wide_str_size, 0);
    MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, &wide_str[0], wide_str_size);

    return wide_str;
}

std::string WStringToString(const std::wstring& wstr)
{
    int narrow_str_size = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, NULL, 0, NULL, NULL);
    std::string narrowStr2(narrow_str_size, 0);
    WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, &narrowStr2[0], narrow_str_size, NULL, NULL);

    return narrowStr2;
}

1.2 linux上的std::string与std::wstring相互转换

在Linux上,可以使用mbstowcs和wcstombs函数来进行std::string和std::wstring之间的转换,代码如下

#include <cstring>

std::wstring StringToWString(const std::string& str)
{
    std::wstring wide_str;
    wide_str.resize(mbstowcs(nullptr, str.c_str(), 0) + 1);
    mbstowcs(&wide_str[0], str.c_str(), str.size());
    return wide_str;
}

std::string WStringToString(const std::wstring& wstr)
{
    std::string narrow_str;
    narrow_str.resize(wcstombs(nullptr, wstr.c_str(), 0) + 1);
    wcstombs(&narrow_str[0], wstr.c_str(), wstr.size());
    return narrow_str;
}

1.3 使用示例

我们可以将上述在windows和linux上的实现进行整合,形成一个跨平台的std::string与std::wstring相互转换函数,代码如下

#include <iostream>
#include <string>

#if defined(WIN32) || defined(_WIN32) || defined(_WIN32_) || defined(WIN64) || defined(_WIN64) || defined(_WIN64_)

#include <Windows.h>

std::wstring StringToWString(const std::string& str)
{
    int wide_str_size = MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
    std::wstring wide_str(wide_str_size, 0);
    MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, &wide_str[0], wide_str_size);

    return wide_str;
}

std::string WStringToString(const std::wstring& wstr)
{
    int narrow_str_size = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, NULL, 0, NULL, NULL);
    std::string narrowStr2(narrow_str_size, 0);
    WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, &narrowStr2[0], narrow_str_size, NULL, NULL);

    return narrowStr2;
}

#elif defined(__linux__)

#include <cstring>

std::wstring StringToWString(const std::string& str)
{
    std::wstring wide_str;
    wide_str.resize(mbstowcs(nullptr, str.c_str(), 0) + 1);
    mbstowcs(&wide_str[0], str.c_str(), str.size());
    return wide_str;
}

std::string WStringToString(const std::wstring& wstr)
{
    std::string narrow_str;
    narrow_str.resize(wcstombs(nullptr, wstr.c_str(), 0) + 1);
    wcstombs(&narrow_str[0], wstr.c_str(), wstr.size());
    return narrow_str;
}

#endif


int main() {
    // std::string 转换为 std::wstring
    std::string narrow_str = "Hello, world!";
    std::wstring wide_str = StringToWString(narrow_str);

    // std::wstring 转换为 std::string
    std::wstring wide_str2 = L"Hello, 世界!";
    std::string narrow_str2 = WStringToString(wide_str2);

    // 输出结果
    std::wcout << wide_str << std::endl;
    std::cout << narrow_str2 << std::endl;

    return 0;
}

1.4 使用std::codecvt_utf8进行std::string与std::wstring相互转换

我们也可以使用std::codecvt_utf8进行std::string与std::wstring相互转换,代码如下

#include <iostream>
#include <string>
#include <locale>
#include <codecvt>

int main() {
    // std::string 转换为 std::wstring
    std::string narrowStr = "Hello, world!";
    std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
    std::wstring wideStr = converter.from_bytes(narrowStr);

    // std::wstring 转换为 std::string
    std::wstring wideStr2 = L"Hello, 世界!";
    std::wstring_convert<std::codecvt_utf8<wchar_t>> converter2;
    std::string narrowStr2 = converter2.to_bytes(wideStr2);

    // 输出结果
    std::wcout << wideStr << std::endl;
    std::cout << narrowStr2 << std::endl;

    return 0;
}

欢迎扫码关注我的微信公众号,及时获取文章更新

微信公众号二维码

本文作者:StubbornHuang

版权声明:本文为站长原创文章,如果转载请注明原文链接!

原文标题:C++ – std::string与std::wstring相互转换

原文链接:https://www.stubbornhuang.com/1589/

发布于:2021年08月20日 17:46:28

修改于:2024年03月07日 17:41:25

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

文章末尾
上一篇
资源分享 - Effective Computational Geometry for Curves and Surfaces 英文PDF下载
计算几何与计算机图形学资源
下一篇
资源分享 - Nonlinear Computational Geometry 英文PDF下载
计算几何与计算机图形学资源
当前分类随机文章推荐

发表评论

您必须 [ 登录 ] 才能发表留言!

关注我们的公众号

微信公众号