一、转码之前需要明白,你转之前的码是什么,你转之后的码是什么?
转言之就是下面两个问题:
1、我们定义的是类还是,数据类型?
2、定义的数据类型是什么编码?(别给我说是unicode)
二、类or数据类型?
先来说第一个:
我们经常会遇到类似与CString、string、wstring、char *(char str[]后面就不写这个了,也就是CHAR),wchar_t *、WCHAR *、LPCTSTR 等等。(F12可以看到最根本的数据类型差不多就是char、WCHAR、wchar_t 这三种)
那么我们明确下我们到底要转的是什么,转到的类型到底是啥?转的是一个“类”,还是数据类型,你要转的目标是类还是数据类型。
(1)string(链接是百度百科)
但是string的定义不认为是对的,我认为是个容器,本质就是一个设计好的类。而我们要转的是里面的是类里面的字符串(char *)。
std::string str ("Please split this sentence into tokens");
char * cstr = new char [str.length()+1];
std::strcpy (cstr, str.c_str()) ;
//……
delete[] cstr;
(2)wstring百度百科上没有了,不误人子弟了
其实点击链接就可以差不多明白了。我在这小结下。
wstring 就是以wchar_t作为字符类型,其余的和string差不多。
CString(链接是百度百科)
F12 MFC atlstr.h
1111 行开始
我们可以看到(先看下面)
#ifndef _ATL_CSTRING_NO_CRT
typedef CStringT< wchar_t, StrTraitATL< wchar_t, ChTraitsCRT< wchar_t > > > CAtlStringW;
typedef CStringT< char, StrTraitATL< char, ChTraitsCRT< char > > > CAtlStringA;
typedef CStringT< TCHAR, StrTraitATL< TCHAR, ChTraitsCRT< TCHAR > > > CAtlString;
#else // _ATL_CSTRING_NO_CRT
typedef CStringT< wchar_t, StrTraitATL< wchar_t > > CAtlStringW;
typedef CStringT< char, StrTraitATL< char > > CAtlStringA;
typedef CStringT< TCHAR, StrTraitATL< TCHAR > > CAtlString;
#endif // _ATL_CSTRING_NO_CRT
#ifndef _AFX
typedef CAtlStringW CStringW;
typedef CAtlStringA CStringA;
typedef CAtlString CString;
#endif
CStringT 再次F12 转到 cstringt.h
看到这里是不是似曾相识燕归来的感觉。
先看个list容器的实现 , 为啥要看这个。仔细瞅瞅就会发现,其实这玩意就是个 容器 。或者说是“封装好的重载的类”。首先是个类,其实和重载的函数,说是封装,因为你除非重写,不然就只能直接用了。
接下里看下不同的参数。三个数据类型分别是:wchar_t、char、TCHAR。前面个两个好理解,但是第三个是啥,别急,我给你个它的另一个写法WCHAR(wchar_t)
(3)LPCTSTR
L表示long指针
这是为了兼容Windows 3.1等16位操作系统遗留下来的,在win32中以及其他的32为操作系统中, long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义。
P表示这是一个指针;
C表示是一个常量;
T表示在Win32环境中, 有一个_T宏,
这个宏用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串;
STR表示这 个变量是一个字符串。
所以LPCTSTR就表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。同样, LPCSTR就只能是一个ANSI字符串,在程序中我们大部分时间要使用带T的类型定义
-----这个稍后补充
我的新浪博客: http://blog.sina.com.cn/s/blog_15f71769f0102xk8q.html