Unicode字符集下CString与char *转换 (解决中文乱码等)(转)
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 *转换 (解决中文乱码等)(转)的更多相关文章
- Unicode字符集下CString与char *相互转换
经常遇到CString转换char*时只返回第一个字符.原因是因为在Unicode字符集下CString会以Unicode的形式来保存数据,强制类型转换只会返回第一个字符.所以直接转换在基于MBCS的 ...
- (原创)Linux下MySQL 5.5/5.6的修改字符集编码为UTF8(彻底解决中文乱码问题)
« CloudStack+XenServer详细部署方案(10):高级网络功能应用 (总结)CentOS Linux 5.x在GPT分区不能引导的解决方法 » 2013-1 11 (原创)Linux下 ...
- MFC:Unicode和多字节字符集下 CString和char的转化(MFC中)
2011-05-16 00:10 1166人阅读 评论(0) 收藏 举报 mfcdelete Unicode下 CString转TCHAR TCHAR* szMsg = new TCHAR[wcsle ...
- 【转贴】Linux下MySQL 5.5的修改字符集编码为UTF8(彻底解决中文乱码问题)
原文地址; http://www.ha97.com/5359.html PS:昨天一同事遇到mysql 5.5中文乱码问题,找我解决.解决了,有个细节问题网上没人说,我就总结一下. 一.登录MySQL ...
- Linux下MySQL 5.5的修改字符集编码为UTF8(彻底解决中文乱码问题)
一.登录MySQL查看用SHOW VARIABLES LIKE 'character%';下字符集,显示如下: +--------------------------+---------------- ...
- Linux下MySQL 5.6的修改字符集编码为UTF8(彻底解决中文乱码问题)
一.登录MySQL查看用SHOW VARIABLES LIKE ‘character%’;下字符集,显示如下:+--------------------------+----------------- ...
- vim(5)vim下wimrc的配置,解决中文乱码问题
解决linux下vim乱码的情况:(修改vimrc的内容) 全局的情况下:即所有用户都能用这个配置 文件地址:/etc/vimrc 在文件中添加: ,ucs-bom,gb18030,gbk,gb231 ...
- Linux 下 vim 编辑文件,解决中文乱码,设置Tab键空格数
vim编辑文件的时候,输入中文就出现乱码 解决办法: 以哪个用户登录的就在哪个用户目录下创建文件 vimrc vim .vimrc (.创建的是隐藏文件) 文件内容: set tabsto ...
- vim学习日志(5):vim下wimrc的配置,解决中文乱码问题
解决linux下vim乱码的情况:(修改vimrc的内容) 全局的情况下:即所有用户都能用这个配置 文件地址:/etc/vimrc 在文件中添加: ,ucs-bom,gb18030,gbk,gb231 ...
随机推荐
- python之萌新入门的第一天
新人的挑战一:配置环境变量及正确地使用工具. 配置环境好难,照着教程做很简单,但是确定环境配置成功好难. 一开始运行helloworld程序的文件时一直出现SyntaxError:invaild sy ...
- Windows Store App 全球化:引用类库资源
前面几个小节介绍了如何引用自身项目的资源,而有时在应用程序开发过程中可能需要访问其他项目中的资源.例如,当几个人或十几个人一起设计一个解决方案时,每个人的工作都是不同的,编写的项目也是不同的,但是每个 ...
- 论C#未来发展
近日M#的消息令江湖再次起了波澜.大家知道,.NET已经进入了瓶颈期.这个消息又让偶有所期待,趁此机会发表一下个人的展望,对C#或者其继任者,不管是M#还是X#. 一.语法特性 1. using引入类 ...
- http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html(转载)(原作者:AstralWind)
Python正则表达式指南 本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例.本文的内容不包括如何编写高效的正则表达式.如何优 ...
- Swift 06.Closures
Closures --闭包 看了好些文章.由于自己也是刚开始学习swift,闭包还是不是很明白.暂时先放放.等看完后面的.加深感触后,在回头总结闭包的概念. 数组中常用的闭包函数 在Swift的数组中 ...
- (DFS、全排列)POJ-2718 Smallest Difference
题目地址 简要题意: 给若干组数字,每组数据是递增的在0--9之间的数,且每组数的个数不确定.对于每组数,输出由这些数组成的两个数的差的绝对值最小是多少(每个数出现且只出现一次). 思路分析: 对于n ...
- T-Shirt 估算法
T-Shirt Size Estimation (2015-05-11 22:58:18) 转载▼ 产出:产品经理会对每一条需求评估上业务影响力的尺寸,如:XXXL 影响一千万人以上或是可以占 ...
- 初始化git远程仓库步骤
Git global setup git config --global user.name "bingo" git config --global user.email &quo ...
- js2
1.JS的三种输出方式: alert("");console.log("");document.write(""); 2.流程控制语句: a ...
- HTML中的select只读
因为Select下拉框只支持disabled属性,不支持readOnly属性,而在提交时,disabled的控件,又是不提交值的.现提供以下几种解决方案: 1.在html中使用以下代码,在select ...