转自:http://blog.csdn.net/neverup_/article/details/5664733

今天进行文件操作时,将CString的GetBuffer()后直接倒到char数组后写入文件发现 每个字符与字符之间都有一个空格存在,而且有内容丢失。原来CString类对象GetBuffer(),后以后还是unicode编码,所以必须将宽字符转换成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的形式来保存数据,强制类型转换只会返回第一个字符。

UniCode 下 CString 转 char* 的方法(转)的更多相关文章

  1. UniCode 下 CString 转 char* 的方法

    今天进行文件操作时,将CString的GetBuffer()后直接倒到char数组后写入文件发现 每个字符与字符之间都有一个空格存在,而且有内容丢失.原来CString类对象GetBuffer(),后 ...

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

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

  3. Unicode字符集下CString与char *相互转换

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

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

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

  5. UNICODE下CString转string

    真搞不懂,为毛C++这么多类型转换.. CString m_str(_T("fuck conversion")); char *chr=new char[m_str.GetLeng ...

  6. mfc CString 转 char *

    做界面时遇到需要从界面编辑框接受输入字符(用户名,密码之类),然后转为char *类型交给程序处理,记录一下找到的方法,主要参考https://blog.csdn.net/neverup_/artic ...

  7. unicode下各种类型转换,CString,string,char*,int,char[]

    把最近用到的各种unicode下类型转换总结了一下,今后遇到其他的再补充: 1.string转CString string a=”abc”; CString str=CString(a.c_str() ...

  8. unicode下char*和CString和一些数据之间的转换

    首先mfc下字符串只有两种数据:char(一个字节)和wchar_t(两个字节),很多其他数据类型如TCHAR,WCHAR等都是这个两个基本类型的宏定义,BYTE是uchar 1.对话框打印char* ...

  9. unicode下各种类型转换CString、string

    把最近用到的各种unicode下类型转换总结了一下: 1.string转CString string a=”abc”; CString str=CString(a.c_str()); 或str.for ...

随机推荐

  1. BZOJ 1192: [HNOI2006]鬼谷子的钱袋 [娱乐]

    题意: n个数分组,使得小于n的每个数都能表示出来,最少几组 就是“最优集合”的超级弱化版.....每次+=now+1 然后一个貌似科学的方法是n二进制拆分 #include <iostream ...

  2. BZOJ 1758: [Wc2010]重建计划 [暂时放弃]

    今天晚上思维比较乱,以后再写写吧#include <iostream> #include <cstdio> #include <cstring> #include ...

  3. H5弹性盒布局的使用(父容器属性)

    为父容器添加display:flex/inline-flex 父容器可以使用的属性有: 1.flex-direction:决定主轴的方向 有四个属性值: row(默认值):主轴为水平方向,起点在左端. ...

  4. 痞子衡随笔:常用的数据传输差错检测技术(1)- 奇偶校验(Parity Check)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式数据传输里的差错检测技术-奇偶校验. 在嵌入式应用里,除了最核心的数据处理外,我们还会经常和数据传输打交道.数据传输需要硬件传输接口 ...

  5. vmware安装centos7

    VMware下安装CentOS7.2 http://www.mamicode.com/info-detail-1455647.html centos7.2配置网络 http://blog.csdn.n ...

  6. 织梦去除版权中的Power by DedeCms

    找到文件 \include\dedesql.class.php 注释或删除下面代码,大概在588行 $arrs1 = array(0x63,0x66,0x67,0x5f,0x70,0x6f,0x77, ...

  7. 框架学习笔记之Maven简介和配置

    一.什么是Maven?★Maven可翻译为“知识的积累”.“专家”.“内行”,它是一个跨平台的项目管理工具.★Maven提供了开发人员构建一个完整的生命周期框架,开发团队可以自动完成项目的基础工具建设 ...

  8. C#委托与事件--简单笔记

    委托 简单记录点东西 适合似懂非懂的朋友看看 委托类型用来定义和响应应用程序中的回调. 借此可以设计各种有面向对象特性的代码模式.下面要说的事件在我看来就是委托的一种实现,再深一步讲,利用委托加事件, ...

  9. PAT乙级 1034

    思路:是个水题,但是有坑.不能被题目忽悠了,题目保证正确的输出中没有超过整型范围的整数. 它只是保证结果不超出int,但是我们在运算过程中的乘法可能会超出int,直接把所有int改成long long ...

  10. Enum枚举写的一个简单状态机

    今天下雨,心情有点压抑,所以用枚举写个状态机排解一下心情,顺便记录一下枚举使用方法. package statemachine; import java.util.ArrayList; import ...