Unicode环境下完成CString向string类型的转换

CString是MFC的字符串类,它不是基本类型,而是对字符串的封装,它是自适应的,在UNICODE环境下就是CStringW,在非UNICODE环境下就是CStringA。

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

CString的三种形式

Visual C++.NET中将CStringT作为ATL和MFC的共享的“一般”字符串类,它有CString、CStringA和CStringW三种形式,分别操作不同字符类型的字符串。这些字符类型是TCHAR、char和wchar_t。TCHAR在Unicode平台中等同于WCHAR(16位Unicode字符),在ANSI中等价于char。wchar_t通常定义为unsigned short。由于CString在MFC应用程序中经常用到,这里不再重复。

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

利用CStringA类型和CStringW两个类型之间可以自动进行转换这一特性,我们可以完成很多类型之间的相互转换,下面举例说明。

在Unicode环境下完成CString向string类型的转换, 可以这么做!

CString src = _T(“你好”); //在Unicode环境下面src是CStringW类型
CStringA temp = src.GetBuffer(0); //通过转化,temp接受了原来字符串的多字节形式
string dst = temp.GetBuffer(0); //现在就可以将值直接赋给string类型了

关于CString::GetBuffer()函数:

函数原型:

LPTSTR GetBuffer( int nMinBufLength )throw( CMemoryException );

Return Value返回值

An LPTSTR pointer to the object’s (null-terminated) character buffer.

一个LPSTR类型的指针,这个指针指向一个以空终止字符串结尾的字符缓冲区。

Parameters  参数

nMinBufLength

The minimum size of the character buffer in characters. This value does not include space for a null terminator.

字符缓冲区的最小大小,这个数值不包括空终止字符型.

Remarks 注意

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.

返回一个指向CString实体的内部的字符缓冲区的指针。返回的 LPTSTR 是非常量的,这意味着你可以直接修改里面的值。

If you use the pointer returned by GetBuffer to change the string contents, you must call ReleaseBuffer before using any other CString member functions.

如果你使用GetBuffer函数返回的指针改变了字符的内容,那么,在使用任何CString别的成员函数的时候,你必须先调用ReleaseBuffer函数。

几点要注意一下:

1.对一个CString变量,你可以使用的唯一合法转换符是LPCTSTR,直接转换成非常量指针(LPTSTR-[const] char*)是错误的。正确的得到一个指向缓冲区的非常量指针的方法是调用GetBuffer()方法。

GetBuffer()主要作用是将字符串的缓冲区长度锁定,releaseBuffer则是解除锁定,使得CString对象在以后的代码中继续可以实现长度自适应增长的功能。

CString ::GetBuffer有两个重载版本:

LPTSTR GetBuffer( );

LPTSTR GetBuffer(int nMinBufferLength);

在第二个版本中,当设定的长度小于原字符串长度时,nMinBufLength = nOldLen,该参数会被忽略,不分配内存,指向原CString;当设定的长度大于原字符串本身的长度时就要重新分配(reallocate)一块比较大的空间出来。而调用第一个版本时,应如通过传入0来调用第二个版本一样。

2.是否需要在GetBufer后面调用ReleaseBuffer(),是根据你的后面的程序是否需要继续使用该字符串变量,并且是否动态改变其长度而定的。如果你GetBuffer以后程序自函数就退出,局部变量都不存在了,调用不调用ReleaseBuffer没什么意义了。

3.不给 GetBuffer 传递参数时它使用默认值 0,意思是:“给我这个字符串的指针,我保证不加长它”。假设你想增加字符串的长度,就必须将你需要的字符空间大小(注意:是字符而不是字节,因为 CString 是以隐含方式感知 Unicode 的)传给它。当调用 ReleaseBuffer 时,字符串的实际长度会被重新计算,然后存入 CString 对象中。
   必须强调一点,在 GetBuffer 和 ReleaseBuffer 之间这个范围,一定不能使用你要操作的这个缓冲的 CString 对象的任何方法。因为 ReleaseBuffer 被调用之前,该 CString 对象的完整性得不到保障。

LPTSTR p = s.GetBuffer();
// do something with pint
m = s.GetLength(); // 可能出错!!!
s.ReleaseBuffer();
int n = s.GetLength(); // 保证正确

Unicode环境下完成CString向string类型的转换

时间: 2024-12-25 14:09:31

Unicode环境下完成CString向string类型的转换的相关文章

Unicode环境下的字符差异

我总是对我的字符串使用_T()宏,这是为了让我的代码至少有Unicode的意识,当然,关于Unicode的话题不在这篇文章的讨论范围._T()宏在8位字符环境下是如下定义的: #define _T(x) x // 非Unicode版本(non-Unicode version) 而在Unicode环境下是如下定义的: #define _T(x) L##x // Unicode版本(Unicode version) 所以在Unicode环境下,它的效果就相当于: s.Format(L"%d"

UNICODE环境下读写txt文件操作

内容转载自http://blog.sina.com.cn/s/blog_5d2bad130100t0x9.html UNICODE环境下读写txt文件操作 (2011-07-26 17:40:05) 标签: 杂谈 分类: MFC程序设计 自己动手整理了一下,写了几个函数,用于UNICODE环境下对txt文本文件的操作,针对txt文本的ANSIC编码格式,进行了字符编码格式的转换.***********************************************************

Delphi Byte数组与String类型的转换

string string = AnsiString = 长字符串,理论上长度不受限制,但其实受限于最大寻址范围2的32次方=4G字节: 变量Str名字是一个指针,指向位于堆内存的字符序列,字符序列起始于@Str[1],@Str[1]偏移负16个字节的空间存储着字串长度.引用计数等信息.字符序列以NULL结束. string[n] string[n] = ShortString = 短字符串,最多容纳255个字符,实际长度是字符长度+1,是Delphi的简单类型: Str[0]存储着字符的个数,

Unicode环境下的类型转换

1.string转CString string a=”abc”; CString str=CString(a.c_str()); 或str.format("%s", a.c_str()) 2.int转CString Int a; CString Cstr; Cstr.Format(_T("%d"),a); 3.char 转 CString CString.format("%s", char*); 例: char  szPath[]; CStrin

C++实现CString和string的互相转换

CString->std::string 例子: CString strMfc=“test“; std::string strStl; strStl=strMfc.GetBuffer(0); unicode情形下: CStringW strw = _T("test");    CStringA stra(strw.GetBuffer(0));    strw.ReleaseBuffer(); std::string imgpath=stra.GetBuffer(0);    st

C++ wchar_t介绍以及和string类型的转换

首先介绍下wchar_t类型 一.wchar_t类型的由来 我们知道char类型变量可以存储一个字节的字符,它用来保存英文字符和标点符号是可以的,但是对于汉字.韩文以及日文这样的字符却不可以,因为汉字.韩文以及日文每一个文字都占据两个字节,为了解决这个问题,c++提出了wchar_t类型,称之为双字节类型,又称宽字符类型. 二.下面是一个范例 int main(int argc, wchar_t* argv[]) { //使用setlocale函数将本机的语言设置为中文简体 setlocale(

[技术分享] 20171211_后端开发_使用@DateTimeFormat注解解决前台string类型与后台date类型的转换,使用@JsonFormat注解解决后台date类型与前台string类型的转换

说明: 有的时候由前台jsp页面填写一个日期,提交到后台spring mvc的时候,我们希望直接转换成一个Date类型,而不是由一个string 类型接收,然后再通过simpleDateFormat来进行转格式,这样太麻烦了,代码会显的很乱,spring为我们提供了类型转化器,写起来也是很麻烦,我们的需求很简单就是由框架帮我们去自动的转换类型而不是手动的转换,在这样的背景下,我们可以使用@DateTimeFormat注解.此外我们还有一个需求就是我们从数据库里面查询到了日期,然后我们想把这个日期

计算两个日期之间相差几天(Date类型与String类型互相转换)

一:计算两个日期之间相差几天 1 /** 2 * 3 */ 4 package com.hlcui.date; 5 6 import java.text.ParseException; 7 import java.text.SimpleDateFormat; 8 import java.util.Calendar; 9 import java.util.Date; 10 11 import org.junit.Test; 12 13 /** 14 * @author Administrator

CString与string之间的转换

(1)CString转换为string CString cs(_T("cs")); string s; s = (LPCSTR)(CStringA)(cs); (2)string转换为CString string s ="Hello World!中国"; CString cs(s.c_str());