Unicode字符集下CString与char *转换 (解决中文乱码等)(转)

时间:2023-01-06 09:26:04

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进行转换

CStringstr = _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

原文地址:

http://blog.csdn.net/linrulei11/article/details/7824954

Unicode字符集下CString与char *转换 (解决中文乱码等)(转)的更多相关文章

  1. Unicode字符集下CString与char &ast;相互转换

    经常遇到CString转换char*时只返回第一个字符.原因是因为在Unicode字符集下CString会以Unicode的形式来保存数据,强制类型转换只会返回第一个字符.所以直接转换在基于MBCS的 ...

  2. (原创)Linux下MySQL 5&period;5&sol;5&period;6的修改字符集编码为UTF8(彻底解决中文乱码问题)

    « CloudStack+XenServer详细部署方案(10):高级网络功能应用 (总结)CentOS Linux 5.x在GPT分区不能引导的解决方法 » 2013-1 11 (原创)Linux下 ...

  3. MFC:Unicode和多字节字符集下 CString和char的转化(MFC中)

    2011-05-16 00:10 1166人阅读 评论(0) 收藏 举报 mfcdelete Unicode下 CString转TCHAR TCHAR* szMsg = new TCHAR[wcsle ...

  4. 【转贴】Linux下MySQL 5&period;5的修改字符集编码为UTF8(彻底解决中文乱码问题)

    原文地址; http://www.ha97.com/5359.html PS:昨天一同事遇到mysql 5.5中文乱码问题,找我解决.解决了,有个细节问题网上没人说,我就总结一下. 一.登录MySQL ...

  5. Linux下MySQL 5&period;5的修改字符集编码为UTF8(彻底解决中文乱码问题)

    一.登录MySQL查看用SHOW VARIABLES LIKE 'character%';下字符集,显示如下: +--------------------------+---------------- ...

  6. Linux下MySQL 5&period;6的修改字符集编码为UTF8(彻底解决中文乱码问题)

    一.登录MySQL查看用SHOW VARIABLES LIKE ‘character%’;下字符集,显示如下:+--------------------------+----------------- ...

  7. vim(5)vim下wimrc的配置,解决中文乱码问题

    解决linux下vim乱码的情况:(修改vimrc的内容) 全局的情况下:即所有用户都能用这个配置 文件地址:/etc/vimrc 在文件中添加: ,ucs-bom,gb18030,gbk,gb231 ...

  8. Linux 下 vim 编辑文件,解决中文乱码,设置Tab键空格数

    vim编辑文件的时候,输入中文就出现乱码 解决办法: 以哪个用户登录的就在哪个用户目录下创建文件 vimrc vim .vimrc       (.创建的是隐藏文件) 文件内容: set tabsto ...

  9. vim学习日志(5):vim下wimrc的配置,解决中文乱码问题

    解决linux下vim乱码的情况:(修改vimrc的内容) 全局的情况下:即所有用户都能用这个配置 文件地址:/etc/vimrc 在文件中添加: ,ucs-bom,gb18030,gbk,gb231 ...

随机推荐

  1. CAS学习笔记(一)

    近期做单点登录,看了一些CAS资料,做下总结 一.cas简介 全名:Central Authentication Service 特点: 1.开源的.多协议的 SSO 解决方案: Protocols  ...

  2. 算法(二)之遗传算法(SGA)

    算法(二)之遗传算法(SGA) 遗传算法(Genetic Algorithm)又叫基因进化算法或进化算法,是模拟达尔文的遗传选择和自然淘汰的生物进化过程的计算模型,属于启发式搜索算法一种. 下面通过下 ...

  3. 你应当如何学习C&plus;&plus;&lpar;以及编程&rpar;(转载)

    你应当如何学习C++(以及编程)(rev#1) By 刘未鹏(pongba) C++的罗浮宫(http://blog.csdn.net/pongba) Javascript是世界上最受误解的语言,其实 ...

  4. CNContact对通讯录的基本使用&lpar;第二篇)

    /** * 注意:iOS9才有能使用 * 首先在工程里导入ContactsUI.framework和Contacts.framework两个框架 * * * 源代码的链接地址 * 链接: http:/ ...

  5. CSS3弹性盒模型,Flex布局教程

    布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现. CSS3中引入flex的弹性盒模型 ...

  6. vg

  7. 在思科路由器上配置AAA实验(Cisco PT&rpar;

     1.拓扑图 Addressing Table 地址表    Device   Interface   IP Address   Subnet Mask   R1 Fa0/0 192.168.1.1 ...

  8. Python数据分析-知识宝藏

    0.SQL数据库 1. python基础知识 2. 重点工具掌握:数据解析核心技巧 - Numpy| Pandas| Matplotlib 3. 数据特征分析:分布| 对比| 统计| 帕累托| 正态| ...

  9. 设计模式--观察者模式Observer(对象行为型)

    一.观察者模式 观察者模式是在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新.观察者模式也被称之为:主题-观察者模式,发布-订阅模式,前者是一,后者是多. ...

  10. MySQL导入数据遇到Error Number&colon; 1467 Failed to read auto-increment value from storage engine错误

    MySQL导入数据遇到Error Number: 1467 Failed to read auto-increment value from storage engine错误 创建表的语句 CREAT ...