Unicode字符集下CString与char *转换

来源:互联网 发布:mac appstore 打不开 编辑:程序博客网 时间:2024/05/22 16:47

UniCode 下 CString 转 char* 的方法的文章有很多,但是大部分都是在互相转载,看了那么多资料,仍然没有解决乱码的问题,后来从一个论坛的一条回复里面找到了正确的方法,特此拿出来与大家分享。

先总结一下网上找到的三种转换的方法:

方法一:使用函数setlocale

    setlocale(LC_ALL,"chs");

    需要包含头文件#include<locale.h>

    此方法的思路是配置地域化信息。通常在需要输入输出中文的时候设置一下,就没问题了,setlocale详情点我

方法二:使用函数: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>

    使用此方法要注意声明标识符,T2A、W2A详情 点我

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

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

           //注意:以下n和len的值大小不同,n是按字符计算的,len是按字节计算的
             int n =str.GetLength();    // n = 14, len = 18

            //获取宽字节字符的大小,大小是按字节计算的
             intlen =WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),NULL,0,NULL,NULL);

            //为多字节字符数组申请空间,数组大小为按字节计算的宽字节字节大小
           char * pFileName = newchar[len+1];  //以字节为单位

           //宽字节编码转换成多字节编码
            WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),pFileName,len,NULL,NULL);

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

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

 这三种方法都是感觉比较靠谱的,也有很多人验证了可以成功,但是在我用的时候很悲催,三种方法都不行,经过仔细的考虑,发现第三种方法应该是万无一失,最保险的方法啊,后来经过仔细查找,原来是参数出了问题,黄色被我划掉的是网上流传的比较广泛的方法,WideCharToMultiByte(CP_ACP,0,str,str.GetLength()+ 1 ,pFileName,len + 1,NULL,NULL);是我验证成功的写法,至于为什么是这样,留给大家自己思考。WideCharToMultiByte详情 点我

小弟才疏学浅,写的不对,敬请指正!

 

----------------------------------------------------------------------------------

-----------------------------------------------------------------------------------

------------------------------------------------------------------------------------

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

1、Unicode下CString转换为char *

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

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

            //注意:以下n和len的值大小不同,n是按字符计算的,len是按字节计算的
             intn =str.GetLength();    // n = 14, len = 18

            //获取宽字节字符的大小,大小是按字节计算的
            int len =WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),NULL,0,NULL,NULL);

            //为多字节字符数组申请空间,数组大小为按字节计算的宽字节字节大小
            char * pFileName = newchar[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的形式来保存数据,强制类型转换只会返回第一个字符。

TrackBack:http://topic.csdn.net/t/20050608/14/4068106.html

                   http://houjixin.blog.163.com/blog/static/35628410200922595225193/

                   http://hi.baidu.com/flobert_young/blog/item/6f93fd0a3ec83f1894ca6b50.html

                   http://hi.baidu.com/proworkspace/blog/item/50cdee44b03f1d86b2b7dc44.html

                   http://msdn.microsoft.com/en-us/library/ms235631.aspx


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 驾驶证过期了6年怎么办 驾驶证过期7个月怎么办 驾驶换证过期了怎么办 和喜欢的人聊天冷场怎么办 老公和小三有了小孩怎么办 战网账号忘记了怎么办 战网邮箱忘了怎么办 捷信分期逾期了怎么办 欠捷信7万还不了怎么办 苹果6s阴阳屏怎么办 碰到碰瓷的人怎么办 如果遇到碰瓷的怎么办 对交通事故责任认定书不服怎么办 违停15天没处理怎么办 衣服反光条掉了怎么办 脸过敏起小疙瘩怎么办 过敏怎么办怎么好得快 眉毛在眉骨下面怎么办 踩到地雷怎么办知乎 在边境踩到地雷怎么办 插在花泥里的花怎么办 瓶插绣球花蔫了怎么办 水养绣球花蔫了怎么办 鲜切绣球花蔫了怎么办 崩坏2仓库满了怎么办 dnf88级没任务了怎么办 0号柴油冻住了怎么办 不小心喝了生水怎么办 不小心吃了蟑螂怎么办 以租代购还不起怎么办 孩子被教官打了怎么办 三岁宝宝叛逆期怎么办 三岁宝宝很叛逆怎么办 孩子不听话怎么办有什么方法呢 打了三岁的宝宝怎么办 2岁半宝宝不听话怎么办 心里素质不好容易紧张怎么办 孩子二年级成绩差怎么办 遇到素质低的人怎么办 孩子上课注意力不集中怎么办 素质报告册丢了怎么办