C++ string和wstring相互转换方式

 更新时间:2023年02月28日 10:34:28   作者:Jimmy1224  
这篇文章主要介绍了C++ string和wstring相互转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

在C++项目编程中,由于项目工程被设置为Unicode编码,因此经常遇到std::string类型和std::wstring类型相互转换的场景,现在将转换方法分享给大家:

%S和%s用法

%s和%S都是格式化控制符,输出字符串类型。

但应用宽字符函数和窄字符函数却又一定的区别,我们针对printf函数以及wprintf函数进行说明:

针对窄字符函数,例如printf,sprintf函数而言:

  • %s 是指以窄字符方式输出字符串
  • %S 是指以宽字符方式输出字符串

针对宽字符函数,例如wprintf,swprintf函数而言,其作用恰恰相反:

  • %s 是指以宽字符方式输出字符串
  • %S 是指以窄字符方式输出字符串

总结起来就是%s是本身函数的字符类型,%S是本身函数类型的相反字符编码。

//输出窄字符
printf("ascii string=%s\n","hello world");
//输出宽字符
printf("unicode string=%S\n",L"hello world");

//输出宽字符
wprintf(L"ascii string=%s\n",L"hello world");
//输出窄字符
wprintf(L"unicode string=%S\n","hello world");

string和wstring转换方法

转换源码如下,需要说明的是这里不支持中文类型转换。

#include <string>
#include <Windows.h>
#include <new>

//wstring类型转换为string类型
std::string GetStringByWchar(const WCHAR* wszString)
{
     std::string strString; 
     if (wszString != NULL)
     {
         std::wstring ws(wszString);
         strString.assign(ws.begin(), ws.end());
     }

     return strString;
}

//string类型转换为wstring类型
std::wstring GetWStringByChar(const char* szString)
{
    std::wstring wstrString;
    if (szString != NULL)
    {
        std::string str(szString);
        wstrString.assign(str.begin(), str.end());
    }

    return wstrString; 
}

void Test()
{
    std::wstring wstrCHar = L"hell world";
    std::string strChar = "hell world";
    printf("ret string=%s\n",GetStringByWchar(wstrCHar.c_str()).c_str());
    printf("ret wstring=%S\n",GetWStringByChar(strChar.c_str()).c_str());
    wprintf(L"ret wstring=%s\n",GetWStringByChar(strChar.c_str()).c_str());
}

运行结果:

ret string=hell world

ret wstring=hell world
ret wstring=hell world
请按任意键继续. . .

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 浅析C语言中assert的用法

    浅析C语言中assert的用法

    以下是对C语言中assert的使用方法进行了介绍,需要的朋友可以参考下
    2013-07-07
  • C++利用MySQL API连接和操作数据库实例详解

    C++利用MySQL API连接和操作数据库实例详解

    这篇文章主要介绍了C++利用MySQL API连接和操作数据库实例详解的相关资料,需要的朋友可以参考下
    2017-01-01
  • C++验证LeetCode包围区域的DFS方法

    C++验证LeetCode包围区域的DFS方法

    这篇文章主要介绍了C++验证LeetCode包围区域的DFS方法,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言对栈的实现基本操作

    C语言对栈的实现基本操作

    栈只允许在一端进行插入或删除操作的线性表。首先栈是一种线性表,但是限定这种线性表只能在某一端进行插入和删除操作,这篇文章主要介绍了C语言对栈的实现基本操作.
    2016-10-10
  • VC定时器的用法实例详解

    VC定时器的用法实例详解

    这篇文章主要介绍了VC定时器的用法,以实例形式详细讲述了VC定时器的原理与具体用法,非常具有实用价值,需要的朋友可以参考下
    2014-10-10
  • 详解C++内存的代码区,全局区,栈区和堆区

    详解C++内存的代码区,全局区,栈区和堆区

    这篇文章主要为大家介绍了C++内存的代码区,全局区,栈区和堆区,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • 代码讲解C++继承和派生

    代码讲解C++继承和派生

    在本文中我们通过实例代码给大家讲解下C++继承和派生相关知识点,需要的朋友们学习下。
    2019-02-02
  • VScode搭建OpenCV环境的详细步骤

    VScode搭建OpenCV环境的详细步骤

    用vscode来写opencv代码需要自己编译OpenCV,主要用到MinGW-w64和CMake工具。接下来通过本文给大家介绍VScode搭建OpenCV环境的相关知识,需要的朋友可以参考下
    2021-11-11
  • C++实现将数据写入Excel工作表的示例代码

    C++实现将数据写入Excel工作表的示例代码

    直观的界面、出色的计算功能和图表工具,使Excel成为最流行的个人计算机数据处理软件。在本文中,您将学习如何使用 Spire.XLS for C++ 创建 Excel 文档,以及如何将数据写入 Excel 工作表
    2023-03-03
  • 详解C语言中的错误报告errno与其相关应用方法

    详解C语言中的错误报告errno与其相关应用方法

    这篇文章主要介绍了C语言中的错误报告errno与其相关应用方法,包括errno和strerror以及perror的介绍,需要的朋友可以参考下
    2015-08-08

最新评论