在Unicode环境下用以下转换:

CString z_strCurtTime = _T("");

// 获取当前时间
CTime z_tCurTime = CTime::GetCurrentTime();
z_strCurtTime = z_tCurTime.Format("%Y-%m-%d %H:%M:%S");
int z_len =WideCharToMultiByte(CP_ACP,0,z_strCurtTime,-1,NULL,0,NULL,NULL);
char *z_cCurTime =new char[z_len +1];
WideCharToMultiByte(CP_ACP,0,z_strCurtTime,-1,z_cCurTime,z_len,NULL,NULL );

1 前言

今天在网上看论坛,发现大家对CString与Char *互转各说一词,其实我发现提问者所说的情况与回答问题的人完全不是同一情况,这里做一总结.

首先大家得清楚一件事,一般在网上提出问题的人大部分使用的都是VC,那么你就应该知道,在VC下编程,工程属性中有一属性Charecter Set属性,其值可以设置为Use Multi-Byte Charecter Set 和 Use Unicode Charecter Set 这两种选择,具默认情况下工程是采用了Use Unicode Charecter Set选项.如我使用的VS2010的工程属性中如下:

VC在处理CString类型字符时,在这两种不种选择的处理结果也是完全不一样的,而网上那么答复大都是针对假设提问者是使用了Use Mult-Byte Chracter Set的前提下,但大多提这个问题的人都是使用了后者的情况的人.

暂且将Use Mult-Byte Chracter Set称之为宽字节字符模式,而Use Unicode Charecter Set称之为Unicode编码模式.

2 宽字节字符模式

首先讨论一下宽字符字符模式下的CStirng与Char *之间的互转,在这种情况下互换很简单:

2.1 CString -->char *

如下:

  1. CString str1 ="123";
  2. char *p =(LPSTR)(LPCSTR)str1;

但好像官方并不建议这么做,而建议采用下面这种方式:

  1. CString str1 ="123";
  2. char *t1 =str1.GetBuffer(str1.GetLength());
  3. str1.ReleaseBuffer();
  4. //do something with t1

网上也有人说是这样t1 =str1.GetBuffer(0);但其实我在实测时并没发现str1.GetBuffer(str1.GetLenth())与str.GetBuffer(0)返回值有啥区别,MSDN中相应说明如下:

  1. CString::GetBuffer
  2. LPTSTR GetBuffer( int nMinBufLength );
  3. throw( CMemoryException );
  4. Return Value
  5. An LPTSTR pointer to the object’s (null-terminated) character buffer.
  6. Parameters
  7. nMinBufLength
  8. The minimum size of the character buffer in characters. This value does not include space for a null terminator.
  9. Remarks
  10. Returns a pointer to the internal character buffer for the CString object. The returned LPTSTR is not const and thus allows direct modification of CString contents.
  11. If you use the pointer returned by GetBuffer to change the string contents, you must call ReleaseBuffer before using any other CString member functions.
  12. The address returned by GetBuffer may not be valid after the call to ReleaseBuffer since additional CString operations may cause the CString buffer to be reallocated. The buffer will not be reallocated if you do not change the length of the CString.
  13. The buffer memory will be freed automatically when the CString object is destroyed.
  14. Note that if you keep track of the string length yourself, you should not append the terminating null character. You must, however, specify the final string length when you release the buffer with ReleaseBuffer. If you do append a terminating null character, you should pass –1 for the length to ReleaseBuffer and ReleaseBuffer will perform a strlen on the buffer to determine its length.

由上可知,GetBuffer的参数nMinBufLength为最小缓冲区长度,但实际结果没啥区别...

2.2 char * -->CString

  1. char *str ="aaaa"
  2. CString str1(str);
  3. //...

2.3 CString -->int

在宽字符字符模式下,这个非常简单:

  1. CString str1 ="123";
  2. int i =atoi(str1);
  3. //do something with i

2.4 int -->CString

  1. int i =100;
  2. CString str;
  3. str.Format("%d",i);
  4. //...

3 Unicode编码模式

3.1 CString -->char *

在这种情况下,上述所说的转化全是浮云,目前只发现可以用WideCharToMultiByte函数来实现.

如下 :

  1. CString str1 =_T("123");
  2. int len =WideCharToMultiByte(CP_ACP,0,str1,-1,NULL,0,NULL,NULL);
  3. char *ptxtTemp =new char[len +1];
  4. WideCharToMultiByte(CP_ACP,0,str1,-1,ptxtTemp,len,NULL,NULL );
  5. //...
  6. delete[] ptxtTemp;

3.2 char * -->CString

还是可以如下:

  1. char *p ="test";
  2. CString str(p);
  3. //...

3.3 CString -->int

在这种情况下atoi不再适用,其实可以用swscanf,如下:

  1. CString str2 =_T("100");
  2. int i;
  3. swscanf(str2,_T("%d"),&i);

3.4 int -->CString

这个其实最简单了,如下:

  1. int j =100;
  2. CString str3;
  3. str3.Format(_T("%d"),j);

CString转std::wstring

std::wstring str = filename.GetString();

std::wstring转CString

CString str( filename.c_str() );

4 结束

另外,有关ANSI与Unicode之间的转换及UTF-8与Unicode之间的转换可以参与下面这个链接:

http://www.cnblogs.com/gakusei/articles/1585211.html

MFC string char cstring 类型转换的更多相关文章

  1. C语言中string char int类型转换

    C语言中string -- ::) 转载 ▼ 标签: 操作符 int char c语言 类型转换 分类: C/Cpp ,char型数字转换为int型 "; printf(]-');//输出结 ...

  2. C++ 中int,char,string,CString类型转换

      1. c++中string到int的转换 1) 在C标准库里面,使用atoi: #include <cstdlib> #include <string> std::stri ...

  3. C++ 中 string, char*, int 类型的相互转换

    一.int 1.int 转换成 string 1) to_string函数 —— c++11标准增加了全局函数std::to_string: string to_string (int val); s ...

  4. MFC中char*,string和CString之间的转换

    MFC中char*,string和CString之间的转换 一.    将CString类转换成char*(LPSTR)类型 方法一,使用强制转换.例如:  CString theString( &q ...

  5. mfc CString,string,char* 之间的转换

    知识点: CString转char*,string string转char*,CString char* 转CString,string 一.CString转char*,string //字串转换测试 ...

  6. MFC/C++/C中字符类型CString, int, string, char*之间的转换

    1 CString,int,string,char*之间的转换 string 转 CString CString.format("%s", string.c_str()); cha ...

  7. CString string char* char 之间的字符转换(多种方法)

    在写程序的时候,我们经常遇到各种各样的类型转换,比如 char* CString string 之间的互相转换.首先解释下三者的含义. CString 是一种很有用的数据类型.它们很大程度上简化了MF ...

  8. 转:char*, char[] ,CString, string的转换

    转:char*, char[] ,CString, string的转换 (一) 概述 string和CString均是字符串模板类,string为标准模板类(STL)定义的字符串类,已经纳入C++标准 ...

  9. 【转】CString,string,char*综合比较

    (一)  概述 1.string和CString均是字符串模a板类: 2.string为标准模板类(STL)定义的字符串类,已经纳入C++标准之中: 3.CString(typedef CString ...

随机推荐

  1. linux忘记root密码怎么办

    如何找回root密码,如果我们不小心,忘记root密码,怎么找回? 思路:进入到单用户模式,然后修改root密码.因为进入单用户模式,root不需要密码就可以登录. 详细过程: 1.打开虚拟机 2.开 ...

  2. 关于在真实物理机器上用cloudermanger或ambari搭建大数据集群注意事项总结、经验和感悟心得(图文详解)

    写在前面的话 (1) 最近一段时间,因担任我团队实验室的大数据环境集群真实物理机器工作,至此,本人秉持负责.认真和细心的态度,先分别在虚拟机上模拟搭建ambari(基于CentOS6.5版本)和clo ...

  3. IDEA里如何安装Python插件打造开发环境(图文详解)

    前言 python是一种功能强大和适用面很广的开发语言,在大数据应用和机器学习日益流行的年代,python凭借其简洁.易用和可扩展性获得很多用户的支持,近年来使用率高速增长.python环境下,集成了 ...

  4. Java线程问题(基础回顾)

    1.概念:线程是运行程序(进程)中单个顺序的小程序,一个进程可以由多个线程组成,而这多个线程共享同一个存储空间,这使得线程间的通信比较容易.在一个多进程的程序中,如果要切换到另一个进程,需要改变地址空 ...

  5. Express4.10.2开发框架中默认app.js的代码注释

    //通过require()加载了express.path等模块var express = require('express');var path = require('path');var favic ...

  6. 【CSS】 布局之剖析负边距

    我们都知道,一个元素框的大小是由元素内容+内边距+边框+外边距来决定的. 关于内边距padding,内边距呈现了元素的背景,其设置值是不可以为负的. 而对于外边距margin,默认为透明,设置值可以为 ...

  7. EntityFramework6 版本更变产生的错误

    LINQ to Entities does not recognize the method 'System.Nullable`1[System.Int32] DiffMinutes(System.N ...

  8. C 标准库 - string.h之strncpy使用

    strncpy 把 src 所指向的字符串复制到 dest,最多复制 n 个字符.当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充. char *strncpy(char *dest ...

  9. js定义一个处理字符串的函数

    //定义一个处理字符串的方法 function StringBuffer(str){ var arr = []; str = str || ''; arr.push(str); //追加字符串 thi ...

  10. sql 表插锁 解锁

    --查锁 select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm ...