IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> windows 下 c++ 各字符(char、wchar_t、string、cstring)的转换 -> 正文阅读

[C++知识库]windows 下 c++ 各字符(char、wchar_t、string、cstring)的转换

c_str()和data()区别是:前者返回带'/0'的字符串,后者则返回不带'/0'的字符串.好像在c++11两者没有区别了

std::string、std::wstring的关系
①:std::string内部是char单字节字符
②:std::wstring内部是WCHAR宽字符,即wchar_t

在MFC的工程中我们可以设置工程的编码属性:
①:对于UNICODE的编码属性CString被定义为CStringW,其内部是WCHAR宽字符 ?即wchar_t
②:对于多字节的编码属性CString被定义为CStringA,其内部是char单字节字符


字符串的ASCII和UNICODE之间的转换
1)Win32提供了API函数MultiByteToWideChar和WideCharToMultiByte来提供这种功能。
2)ATL还提供了另一套转换宏——CA2W、CA2T、CA2WEX、CA2CT、CW2T、CW2A、CW2AWX
CW2A将宽字符集(Unicode)转化为多字符集(ASCII)
CA2W就是将多字符集(ASCII)转化为宽字符集(Unicode)


所以,自己推测的,在mfc的UNICODE的编码
1.string.c_str() 得到char*
2.wstring.c_str() 得到cstring

char []转char *:直接进行赋值即可
char str[] = "lala";
char *str1 = str;

char *转char[]:字符拷贝实现,不能进行赋值操作
char *st = "hehe";
char st1[] = "lalalala";
strncpy(st1, st, strlen(st) + 1); // 注意加1操作

string 转 char* ?:c_str() ? ?使用str.c_str()返回的是const char* 类型,如果想转换为char* 类型需经过const_cast<char*>()
string str11 = "hello";
const char *p1 = str11.c_str(); ?//注意必须加上const,不然编译不过
或者char *st1 = const_cast<char *>(str11.c_str());

char *转string:
1)直接赋值;
const char *st = "hello";
string st1 = st;
//注意,定义char *变量,并直接赋值,最好定义为const变量,否则编译器警告
2)构造转换实现
const char *st = "hello";
string s1(st, st + strlen(st));

char []转string:
1)直接赋值;
char st[] = "hello";
string st1 = st;
2)构造转换实现
string st2(st, st + strlen(st));

string转char[]:拷贝实现,不能直接赋值。即string不能直接转换为char[],可以先转换为char*,再通过strcpy来转换
string ts = "My test1";
char ts1[] = "lalallalalaaaa";
strncpy_s(ts1, ts.c_str(), ts.length() + 1); // 注意,一定要加1,否则没有赋值'\0'

同理:wchar_t* 、wchar_t[] 、wstring 互转参考上面的
wstring 转wchar_t* ? c_str() ? ?使用str.c_str()返回的是const wchar_t* 类型,如果想转换为wchar_t* 类型需经过const_cast<wchar_t*>()
?? ?std::wstring test5 = L"中文";
?? ?const wchar_t* test8 = test5.c_str();
?? ?wchar_t* test9 = const_cast<wchar_t*> (test5.c_str());

wchar_t *转 char * ?和 char * 转 wchar_t*
方法一:利用Windows的宏W2A,A2W
?? ?USES_CONVERSION;
?? ?char* test1 = W2A(L"我是宽字节");//转化成默认
?? ?wchar_t* test12 = A2W("我是窄字节");
方法二:利用Windows里的ATL里面的类CW2A和CA2W
CW2A将宽字符集(Unicode)转化为多字符集(ASCII)
CA2W就是将多字符集(ASCII)转化为宽字符集(Unicode)
?? ?std::string ?test3 = CW2A(L"中文字符", CP_UTF8);//一般可以加一下第二个参数,顺便切换编码
?? ?std::wstring test4 = CA2W("中文字符");//一般不用加第二个参数
方法三:利用Windows API中的函数 WideCharToMultiByte 和 MultiByteToWideChar?
? ? wchar_t * char2wchar(const char* cchar, size_t m_encode = CP_ACP)
? ? { ? ??
? ? ? ? wchar_t *m_wchar; ? ?
? ? ? ? int len = MultiByteToWideChar( m_encode ,0,cchar ,strlen( cchar), NULL,0); ? ??
? ? ? ? m_wchar= new wchar_t[len+1]; ? ??
? ? ? ? MultiByteToWideChar( m_encode ,0,cchar,strlen( cchar),m_wchar,len); ? ??
? ? ? ? m_wchar[len]= '\0' ; ? ?
? ? ? ? return m_wchar;
? ? }
?? ?char * wchar2char(const wchar_t* wchar ,size_t m_encode = CP_ACP)
? ? {
? ? ? ? char * m_char; ? ?
? ? ? ? int len= WideCharToMultiByte( m_encode ,0,wchar ,wcslen( wchar ), NULL,0, NULL ,NULL ); ? ?
? ? ? ? m_char= new char[len+1]; ? ??
? ? ? ? WideCharToMultiByte( m_encode ,0,wp ,wcslen( wchar ),m_char,len, NULL ,NULL ); ? ??
? ? ? ? m_char[len]= '\0'; ? ??
? ? ? ? return m_char;
? ? }

所以string 和wstring 互转 ?参考 ? wchar_t *互转 char *?
std::wstring test16 = L"中文字符";
std::string ?test17 = CW2A(test16.c_str());

wstring 转 cstring ? ?c_str()
std::wstring test5 = L"中文";
CString strtest5 = test5.c_str();


cstring 转 wstring
方法一:GetString() 只读
?? ?CString strtest5 = _T("中文");
?? ?std::wstring test6 = strtest5.GetString();
方法二:GetBuffer() 读写 需要ReleaseBuffer()配合一起
? ? CString strtest5 = _T("中文");
?? ?std::wstring test7 = strtest5.GetBuffer();
?? ?strtest5.ReleaseBuffer();


cstring 转 wchar_t* ? ? GetBuffer 和ReleaseBuffer
? ? CString strtest5 = _T("中文");
? ? const wchar_t* test10 = strtest5.GetBuffer();
?? ?strtest5.ReleaseBuffer();


cstring 转 wchar_t[] ? 字符拷贝实现,不能进行赋值操作
? ? CString strtest5 = _T("中文");
? ? wchar_t test11[8] = {0};
?? ?wcscpy_s(test11, strtest5.GetBuffer());
?? ?strtest5.ReleaseBuffer();


wchar_t[] ?转 cstring ? 直接赋值;
? ? wchar_t test13[8] = L"中文";
?? ?CString strtest12 = test13;


wchar_* ?转 cstring ? ?直接赋值;
? ? wchar_t* test14 = L"中文";
?? ?CString strtest15 = test14;?? ?

char*、char*[]、string 转cstring ?分ASCII和UNICODE两种编码格式
1.ASCII或者说是多字节 ? 直接赋值或者是format
? string -> CString :
? ?? ?std::string ?test18 = "hell0";
?? ?CString strtest19;
?? ?strtest19.Format(_T("%s"), test18.c_str());
?? ?CString strtest20;
?? ?strtest20 = test18.c_str();
2.UNICODE或者说是宽字节 ? 参考 char * 转 wchar_t* ? 不能直接赋值,同时考虑中文乱码问题。
? 如有中文,最好使用 MultiByteToWideChar?
??
cstring ?转char*、char*[]、string ?分ASCII和UNICODE两种编码格式
1.ASCII或者说是多字节
?CString -> string :
?办法一:GetBuffer ?//GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.
? ? CString str11 = "123";
?? ?char *t1 = str11.GetBuffer();
?? ?str11.ReleaseBuffer();
办法二:(LPSTR)(LPCSTR)
? ? CString str1 = "123";
?? ?char *p = (LPSTR)(LPCSTR)str1;
2.UNICODE或者说是宽字节 ? 参考 wchar_t* ?转 char * ? 不能直接赋值,同时考虑中文乱码问题。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-15 11:36:23  更:2021-10-15 11:38:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:01:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码