UniCode 下CString 转 char*,利用WideCharToMultiByte进行转换,中文乱码的解决方案
2011-08-24 13:20
459 查看
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
//获取宽字节字符的大小,大小是按字节计算的
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);
WideCharToMultiByte(CP_ACP,0,str,str.GetLength() + 1 ,pFileName,len + 1
,NULL,NULL);
pFileName[len+1] = '/0';
//多字节字符以'/0'结束
//多谢楼下的提醒,特此修改一下
pFileName[len] = '\0'; //多字节字符以'\0'结束
这三种方法都是感觉比较靠谱的,也有很多人验证了可以成功,但是在我用的时候很悲催,三种方法都不行,经过仔细的考虑,发现第三种方法应该是万无一失,最保险的方法啊,后来经过仔细查找,原来是参数出了问题,黄色被我划掉的是网上流传的比较广泛的方法,WideCharToMultiByte(CP_ACP,0,str,str.GetLength() + 1 ,pFileName,len + 1 ,NULL,NULL);是我验证成功的写法,至于为什么是这样,留给大家自己思考。WideCharToMultiByte详情 点我
小弟才疏学浅,写的不对,敬请指正!
先总结一下网上找到的三种转换的方法:
方法一:使用函数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
//获取宽字节字符的大小,大小是按字节计算的
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);
WideCharToMultiByte(CP_ACP,0,str,str.GetLength() + 1 ,pFileName,len + 1
,NULL,NULL);
pFileName[len+1] = '/0';
//多字节字符以'/0'结束
//多谢楼下的提醒,特此修改一下
pFileName[len] = '\0'; //多字节字符以'\0'结束
这三种方法都是感觉比较靠谱的,也有很多人验证了可以成功,但是在我用的时候很悲催,三种方法都不行,经过仔细的考虑,发现第三种方法应该是万无一失,最保险的方法啊,后来经过仔细查找,原来是参数出了问题,黄色被我划掉的是网上流传的比较广泛的方法,WideCharToMultiByte(CP_ACP,0,str,str.GetLength() + 1 ,pFileName,len + 1 ,NULL,NULL);是我验证成功的写法,至于为什么是这样,留给大家自己思考。WideCharToMultiByte详情 点我
小弟才疏学浅,写的不对,敬请指正!
相关文章推荐
- UniCode 下CString 转 char*,利用WideCharToMultiByte进行转换,中文乱码的解决方案
- UniCode 下CString 转 char*,利用WideCharToMultiByte进行转换,中文乱码的解决方案
- UniCode 下char*转CString ,利用MultiByteToWideChar进行转换,中文乱码的解决方案
- UniCode 下CString 转 char*,利用WideCharToMultiByte进行转换
- 利用wcstombs将中文wchar_t转换为char,模拟WideCharToMultiByte
- ANIS与UNICODE字符格式转换:MultiByteToWideChar() 和WideCharToMultiByte() 函数
- Cocos2d-x程序Windows下VC中文乱码的解决(用MultiByteToWideChar进行转换,VC2010有非常厉害的execution_character_set)
- LPCWSTR和CString 转换,在WideCharToMultiByte函数中应用
- MultiByteToWideChar和WideCharToMultiByte用法详解, ANSI和UNICODE之间的转换
- 用MultiByteToWideChar和WideCharToMultiByte进行短字符和宽字符之间的转换
- UNICODE和ANSI字符串的转换(解释了MultiByteToWideChar,WideCharToMultiByte,GetTextCharsetInfo,GetTextCharset,IsDBCSLeadByte,IsDBCSLeadByteEx,IsTextUnicode一共7个函数)
- 用MultiByteToWideChar和WideCharToMultiByte进行短字符和宽字符之间的转换
- ANIS与UNICODE字符格式转换:MultiByteToWideChar()和WideCharToMultiByte()函数介绍
- Wince 字符转换(WideCharToMultiByte和MultiByteToWideChar)方法
- WideCharToMultiByte(Unicode转char *)
- 使用 WideCharToMultiByte Unicode 与 UTF-8互转
- 多字节转换MultiByteToWideChar和WideCharToMultiByte使用小结
- WideCharToMultiByte和MultiByteToWideChar函数的用法(ascii转unicode unicode转ascii)
- COM初接触及字符转换WideCharToMultiByte
- WideCharToMultiByte 宽字节转换为多字节