Unicode字符集下CString与char *转换
发布日期:2022-01-31 02:37:25 浏览次数:45 分类:技术文章

本文共 1922 字,大约阅读时间需要 6 分钟。

Unicode字符集下CString与char *转换

    

 在Visual C++.NET2005中,默认的字符集形式是Unicode,但在VC6.0等工程中,默认的字符集形式是多字节字符集(MBCS:Multi-Byte Character Set),这样导致在VC6.0中非常简单实用的各类字符操作和函数在VS2005环境下运行时会报各种各样的错误,这里总结了在Visual C++.NET2005环境中Unicode字符集下CString和char *之间相互转换的几种方法,其实也就是Unicode字符集与MBCS字符集转换。

1、Unicode下CString转换为char *

方法一:使用API:WideCharToMultiByte进行转换

             CString str = _T("D://校内项目//QQ.bmp");

             //注意:以下n和len的值大小不同,n是按字符计算的,len是按字节计算的

             int n = str.GetLength();     // n = 14, len = 18

             //获取宽字节字符的大小,大小是按字节计算的

             int len = WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),NULL,0,NULL,NULL);

             //为多字节字符数组申请空间,数组大小为按字节计算的宽字节字节大小

             char * pFileName = new char[len+1];   //以字节为单位

             //宽字节编码转换成多字节编码

             WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),pFileName,len,NULL,NULL);

             pFileName[len+1] = '/0';   //多字节字符以'/0'结束

方法二:使用函数:T2A、W2A

             CString str = _T("D://校内项目//QQ.bmp");

             //声明标识符

             USES_CONVERSION;

             //调用函数,T2A和W2A均支持ATL和MFC中的字符转换

             char * pFileName = T2A(str);   
             //char * pFileName = W2A(str);  //也可实现转换

            注意:有时候可能还需要添加引用#include  <afxpriv.h>

2、Unicode下char *转换为CString

方法一:使用API:MultiByteToWideChar进行转换

              char * pFileName = "D://校内项目//QQ.bmp";

              //计算char *数组大小,以字节为单位,一个汉字占两个字节

              int charLen = strlen(pFileName);

              //计算多字节字符的大小,按字符计算。

              int len = MultiByteToWideChar(CP_ACP,0,pFileName,charLen,NULL,0);

              //为宽字节字符数组申请空间,数组大小为按字节计算的多字节字符大小

              TCHAR *buf = new TCHAR[len + 1];

              //多字节编码转换成宽字节编码

              MultiByteToWideChar(CP_ACP,0,pFileName,charLen,buf,len);

              buf[len] = '/0';  //添加字符串结尾,注意不是len+1

 
              //将TCHAR数组转换为CString
              CString pWideChar;
              pWideChar.Append(buf);

              //删除缓冲区

              delete []buf;

方法二:使用函数:A2T、A2W

              char * pFileName = "D://校内项目//QQ.bmp";

              USES_CONVERSION;

              CString s = A2T(pFileName);

              //CString s = A2W(pFileName);

方法三:使用_T宏,将字符串转换为宽字符

            //多字节字符集,在vc6和vc7种可以编译通过的语句,但VS2005不能通过,默认为Unicode字符集

            //AfxMessageBox("加载数据失败",0);

            //书写使用TEXT("")或_T(""),文本在UNICODE和非UNICODE里都通用

            AfxMessageBox(_T("加载数据失败"),0);  

      注意:直接转换在基于MBCS的工程可以,但在基于Unicode字符集的工程中直接转换是不可行的,CString会以Unicode的形式来保存数据,强制类型转换只会返回第一个字符

方法四:

  使用format格式控制符,注意使用%S  字母是大写的

转载地址:https://blog.csdn.net/LJH0600301217/article/details/46457841 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:创建和销毁过程几个函数的执行顺序
下一篇:C语言 内存分配 地址 指针 数组 参数 实例解析

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年03月18日 21时33分39秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

java 转发上传文件_java 后台请求其他接口转发文件 2019-04-21
Java get set 同步_java – getResultSet()“每个结果只能调用一次” 2021-06-24
java jmx 配置_为什么在配置JMX时Java打开3个端口? 2021-06-24
java thread回调_使用Runnable在Java中实现回调 2021-06-24
java 内存区_Java内存模型和Java内存区域的区别和联系? 2021-06-24
java定时任务监控_Spring定时任务使用及如何使用邮件监控服务器 2021-06-24
java crc32 使用_Java CRC32的用法 2021-06-24
java读取unicode_java怎么样将unicode解码读取?Java读取本地文件进 2021-06-24
java.io.file()_Java File getUsableSpace()方法 2021-06-24
java httpclient 工具_spring整合httpClient工具类 2021-06-24
java监控其他服务器运行状态_windows服务器监控多个tomcat运行状态 2021-06-24
java给学生按总成绩排名_java - 输入学生成绩,取它们的平均值,然后通过排名等级的学生 - SO中文参考 - www.soinside.com... 2021-06-24
java构造函数有什么用_java构造函数有什么用,怎么用 2021-06-24
mysql 匹配 隔开的_按空格分隔关键字并搜索MySQL数据库 2021-06-24
java factory用法_怎样使用Java实现Factory设计模式 2021-06-24
java窗口内容如何复制_求助Java窗口菜单如何实现复制粘贴剪切等功能(内附源代码)... 2021-06-24
盾神与砝码称重java_[蓝桥杯][算法提高VIP]盾神与砝码称重 2021-06-24
java输出狗的各类信息_第九章Java输入输出操作 2021-06-24
java notify怎么用_java 如何使用notify() 2019-04-21
java加载指定文件为当前文本,java:如何使用bufferedreader读取特定的行 2019-04-21