详解C/C++实现各种字符转换方法合集

目录
  • 一、std::string 和 std::wstring 互转
    • 1、直接声明std::wstring
    • 2、wstring_convert
    • 3、WideCharToMultiByte和MultiByteToWideChar
  • 二、winrt::hstring 和 std::string 互转
  • 三、const char* 和 char* 互转
    • 1、const char*转char*
    • 2、 char*转const char*
  • 四、QString 和 std::string 互转
  • 补充
    • CString 和 *char 的转换
    • *char 与 int 的转换

一、std::string 和 std::wstring 互转

1、直接声明std::wstring

std::wstring uriImage{L"D:\\Project\\screen.jpg"};
Uri uri{ uriImage };

2、wstring_convert

由于C++17之后取消std::codecvt_utf8的支持,所以这个方法不是最好的。可以考虑使用WideCharToMultiByte和MultiByteToWideChar替代。

std::wstring wideString = std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes(stringToConvert);

3、WideCharToMultiByte和MultiByteToWideChar

std::string MyTools::ConvertWideToANSI(const std::wstring& wstr)
{
    int count = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.length(), NULL, 0, NULL, NULL);
    std::string str(count, 0);
    WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, &str[0], count, NULL, NULL);
    return str;
}

std::wstring MyTools::ConvertAnsiToWide(const std::string& str)
{
    int count = MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), NULL, 0);
    std::wstring wstr(count, 0);
    MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), &wstr[0], count);
    return wstr;
}

std::string MyTools::ConvertWideToUtf8(const std::wstring& wstr)
{
    int count = WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), wstr.length(), NULL, 0, NULL, NULL);
    std::string str(count, 0);
    WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, &str[0], count, NULL, NULL);
    return str;
}

std::wstring MyTools::ConvertUtf8ToWide(const std::string& str)
{
    int count = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), NULL, 0);
    std::wstring wstr(count, 0);
    MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), &wstr[0], count);
    return wstr;
}

二、winrt::hstring 和 std::string 互转

winrt::hstring是C++/WinRT 的自定义字符串类型(在 C++/WinRT 基础库中定义,即%WindowsSdkDir%Include\<WindowsTargetPlatformVersion>\cppwinrt\winrt\base.h)。

// 直接声明一个winrt::hstring
winrt::hstring w{L"zh-CN"};
// 调用winrt::to_hstring方法直接把std::string转为winrt::hstring
winrt::hstring htr = winrt::to_hstring("this is a std string");

// 调用winrt::to_string转为std::string
winrt::hstring w{L"zh-CN1111测试"};
std::string temp = winrt::to_string(w);

三、const char* 和 char* 互转

1、const char*转char*

const char *filePath= "abc";
char *newPath = const_cast<char *>(filePath);

2、 char*转const char*

直接赋值即可

const char* cpc;
char* pc = "abcde";
cpc = pc;

四、QString 和 std::string 互转

std::string a = "asdfg";
QString path = QString::fromStdString("asdfg");
std::string d = path.toStdString();

补充

CString 和 *char 的转换

1:CString -> *char

1)CString转化为*char可以使用CString中的GetBuffer()函数,具体如下:

CString string1 = _T("string");
char *str = string1.GetBuffer();

注意的是,在GetBuffer后要使用ReleaseBuffer以更新对象内部数据,否则会发生不可意料的意外。

2)可以使用强制转换。

CString string1 = _T(“string”);
char *str = (LPTSTR)(LPCTSTR)string1;

3)也可使用函数strcpy实现转换。

4)使用CString的GetAt()函数:

CString string1 = _T("string");
char *str = string1.GetAt(0);

即获取下标为0的字符。

2:*char -> CString

1)使用format函数:

char *str = "string";
CString string1;
string1.format("%s",str);

2)同样也可以强制转换:

char *str = "string";
CString string1(str);

*char 与 int 的转换

1:*char -> int

1)使用atoi()函数:

char *val = "12345";
int num = atoi(val);

2:int -> *char

1)使用itoa()函数:

int num = 12345;
char buf[5];
itoa(buf, num, 10);

itoa()函数中后面10代表十进制。

2)使用sprintf()函数:

int num = 12345;
char buf[6];
sprintf(buf, "%d", num);

到此这篇关于详解C/C++实现各种字符转换方法合集的文章就介绍到这了,更多相关C++字符转换内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++关于字符的接收与输出操作示例

    C语言中,在使用scanf("%c",&data);读取一个字符时,有时会遇到scanf吞回车符的情况. 这里搜到几种常用的解决方法: 1.在scanf()中使用’\n’屏蔽回车符号. scanf("\n%c",&c); 2.在scanf()格式串最前面添加空格,屏蔽回车字符 scanf(" %c",&c); //%c前面加空格,过滤回车 3.在接收字符前,使用getchar()来读取一次回车符号 getchar(); /

  • C++如何将字符串颠倒输出

    目录 如何将字符串颠倒输出 本题重点在于string字符串的颠倒函数 如何将字符串颠倒输出 请定义一个类Test,其拥有一个私有数据成员str(string类型),和其他对字符串进行简单操作的行为. 请根据如下main函数的代码完成类Test的定义 int main() { string str;   //输入一个字符串 getline(cin, str); //实例化对象 Test* s = new Test(); //设置对象中的数据成员值 s->SetStr(str); cout <&l

  • C++超详细讲解字符串类

    目录 一.历史遗留问题 二.解决方案 三.标准库中的字符串类 四.字符串循环右移 五.小结 一.历史遗留问题 C 语言不支持真正意义上的字符串 C 语言用字符数组和一组函数实现字符串操作 C 语言不支持自定义类型,因此无法获得字符串类型 二.解决方案 从 C 到 C++ 的进化过程引入了自定义类型 在 C++ 中可以通过类完成字符串类型的定义 三.标准库中的字符串类 C++ 语言直接支持 C 语言的所有概念 C++ 语言中没有原生的字符串类型 C++ 标准库提供了 string 类型 strin

  • C++实现字符串切割的两种方法

    目录 字符串切割的两种方法 1.通过stl实现 2.通过使用strtok()函数实现 字符串分割&类型转换(string->double) 字符串切割的两种方法 字符串切割的使用频率还是挺高的,string本身没有提供切割的方法,但可以使用stl提供的封装进行实现或者通过c函数strtok()函数实现. 1.通过stl实现 涉及到string类的两个函数find和substr: 1.find函数 原型:size_t find ( const string& str, size_t p

  • 详解C/C++实现各种字符转换方法合集

    目录 一.std::string 和 std::wstring 互转 1.直接声明std::wstring 2.wstring_convert 3.WideCharToMultiByte和MultiByteToWideChar 二.winrt::hstring 和 std::string 互转 三.const char* 和 char* 互转 1.const char*转char* 2. char*转const char* 四.QString 和 std::string 互转 补充 CStrin

  • PHP详解ASCII码对照表与字符转换

    一,通用的ASCII码对照表 图解ASCII码对照表图,以字符A为例Dec表示十进制,如65Hx表示十六进制,如41Oct表示八进制,如101Char表示显示字符,如A ASCII码对照表图分为两个单元1,控制字符 0-31和1272,可显示字符 32-126(1)48-57为0到9十个阿拉伯数字:(2)65-90为26个大写英文字母:(3)97-122号为26个小写英文字母:(4)其它标点符号.运算符号等: 二,ASCII扩展码对照表 三,PHP字符转换函数说明 具体字符转换函数说明请参考[P

  • 详解Java语言中一个字符占几个字节?

    题主要区分清楚内码(internal encoding)和外码(external encoding)就好了. 内码是程序内部使用的字符编码,特别是某种语言实现其char或String类型在内存里用的内部编码: 外码是程序与外部交互时外部使用的字符编码."外部"相对"内部"而言:不是char或String在内存里用的内部编码的地方都可以认为是"外部".例如,外部可以是序列化之后的char或String,或者外部的文件.命令行参数之类的. Java语

  • 详解Java编程中面向字符的输出流

    面向字符的输出流都是类 Writer 的子类,其类层次结构如图所示. 下表列出了 Writer 的主要子类及说明. 使用 FileWriter 类写入文件 FileWriter 类是 Writer 子类 OutputStreamWriter 类的子类,因此 FileWriter 类既可以使用 Writer类的方法也可以使用 OutputStreamWriter 类的方法来创建对象. 在使用 FileWriter 类写入文件时,必须先调用 FileWriter()构造方法创建 FileWriter

  • 详解Swift中的Characters字符类型与String字符串类型

    一.引言 Swift中提供了String类型与Characters类型来处理字符串和字符数据,Swift中的String类型除了提供了许多方便开发者使用的方法外,还可以与Foundation框架的NSString类进行转换,使用起来十分方便. 二.String基础 在Swift中,使用双引号来定义字符串,开发者可以通过如下代码来创建一个字符串常量: let str = "Hello, playground" 可以通过下面两种方式来创建空字符串: let str1 = "&qu

  • 详解如何使用PM2将Node.js的集群变得更加容易

    介绍 众所周知,Node.js运行在Chrome的JavaScript运行时平台上,我们把该平台优雅地称之为V8引擎.不论是V8引擎,还是之后的Node.js,都是以单线程的方式运行的,因此,在多核心处理器的系统中并不能发挥其最大的性能. Node.js的cluster模块 幸运的是,Node.js给我们提供了cluster模块,它可以生成多个工作线程来共享同一个TCP连接. 它是如何运作的呢? 首先,Cluster会创建一个master,然后根据你指定的数量复制出多个server app(也被

  • 详解易语言字符命令

    易语言字符命令,这个命令比较少见,但是有用,我教大家操作. 1.易语言新建一个windows窗口 点击进入代码编辑区 具体看如何用易语言编写自己第一个程序? 2.我们输入 这个命令 字符() 3.展开这个字符命令 我们发现只有一个参数 4.这个参数比较少见,字节型它的取值范围为0~255 我们输入100看看 5.运用调试输出这个函数,具体看易语言调试输出函数实例详解 我们输入调试输出 (字符 (100)) 6.结果为 d 这个需要对照 ASCII表看看

  • php封装json通信接口详解及实例

    php创建JSON数据详解: <?php //创建一个字符数组 $arr=array( 'id'=>1, 'name'=>'david' ); echo json_encode($arr);//这个是创建JSON的关键函数 ?> 实现结果 {"id":1,"name":"david"} 注意: json_encode($value);这个函数只能接收utf-8编码的数据.其他格式数据传给该函数返回null; 封装通信接口的

  • Elasticsearches的集群搭建及数据分片过程详解

    目录 Elasticsearch高级之集群搭建,数据分片 广播方式 单播方式 选取主节点 什么是脑裂 错误识别 Elasticsearch高级之集群搭建,数据分片 es使用两种不同的方式来发现对方: 广播 单播 也可以同时使用两者,但默认的广播,单播需要已知节点列表来完成 广播方式 当es实例启动的时候,它发送了广播的ping请求到地址224.2.2.4:54328.而其他的es实例使用同样的集群名称响应了这个请求. 一般这个默认的集群名称就是上面的cluster_name对应的elastics

  • tomcat 集群监控与弹性伸缩详解

    目录 如何给 tomcat 配置合适的线程池 如何监控 tomcat 线程池的工作情况 tomcat 线程池扩缩容 tomcat 是如何避免原生线程池的缺陷的 如何给 tomcat 配置合适的线程池 任务分为 CPU 密集型和 IO 密集型 对于 CPU 密集型的应用来说,需要大量 CPU 计算速度很快,线程池如果过多,则保存和切换上下文开销过高反而会影响性能,可以适当将线程数量调小一些 对于 IO 密集型应用来说常见于普通的业务系统,比如会去查询 mysql.redis 等然后在内存中做简单的

随机推荐