VS 开发中的字符串转换 (二)

来源:互联网 发布:200元算网络诈骗吗 编辑:程序博客网 时间:2024/04/30 18:09

【整理】Dword、LPSTR、LPWSTR、LPCSTR、LPCWSTR、LPTSTR、LPCTSTR

L表示long指针,这是为了兼容Windows 3.1等16位操作系统遗留下来的,在win32中以及其他的32为操作系统中, long指针和near指针及far修饰符都是为了兼容的作用,没有实际意义。即win32中,long,near,far指针与普通指针没有区别,LP 与P是等效的。

P表示这是一个指针。

T表示_T宏,这个宏用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串。

STR表示这个变量是一个字符串。

C表示是一个常量,const。

LPTSTR: 如果定义了UNICODE宏则LPTSTR被定义为LPWSTR。typedef LPTSTR LPWSTR;

否则LPTSTR被定义为LPSTR。 typedef LPTSTR LPSTR;

 

下面列出一些常用的typedefs:

类型       MBCS     Unicode

WCHAR     wchar_t    wchar_t

LPSTR       char*     char*

LPCSTR     const char*  const char*

LPWSTR         wchar_t*    wchar_t*

LPCWSTR    const wchar_t* const wchar_t*

TCHAR         char         wchar_t

LPTSTR       TCHAR*(或char*) TCHAR* (或wchar_t*)

LPCTSTR   const TCHAR*   const TCHAR*

由于Win32 API文档的函数列表使用函数的常用名字(例如, SetWindowText"),所有的字符串都是用TCHAR来定义的。(除了XP中引入的只适用于Unicode的API)。所以结论,在 VS2005系统中,为提高可移植性,定义字符串时用TCHAR,转化为UNICODE时用_T而不用L。


 

首先在编译程序时经常会遇到这种问题:

错误 1 error C2664: “CWnd::MessageBoxW”: 不能将参数 1 从“const char [3]”转换为“LPCTSTR”

 

1、觉得很烦,一般的做法就是不管三七二十一,在字符串前面加一个‘L’

如调用函数FUN(LPCTSTR str)时,不能  FUN("HELLO");     而是FUN(L"HELLO");

通常这样做都比较能解决问题。

 

2、或者还可以用_T(), 即 FUN(_T("HELLO"));   _T() 的别名还有 _TEXT(), TEXT()。

 

稍微研究了下,BSTR,LPSTR,LPWSTR,LPCTSTR,LPTSTR等这些让人头晕的东东。(还是C#里简单啊,直接tostring)

 

BSTR:是一个OLECHAR*类型的Unicode字符串,是一个COM字符串,带长度前缀,与VB有关,没怎么用到过。

 

LPSTR:即 char *,指向以'/0'结尾的8位(单字节)ANSI字符数组指针

LPWSTR:即wchar_t *,指向'/0'结尾的16位(双字节)Unicode字符数组指针

 

LPCSTR:即const char *

LPCWSTR:即const wchar_t *

 

LPTSTR:LPSTR、LPWSTR两者二选一,取决于是否宏定义了UNICODE或ANSI

LPCTSTR: LPCSTR、LPCWSTR两者二选一,取决于是否宏定义了UNICODE或ANSI,如下是从MFC库中拷来的:

#ifdef UNICODE

    typedef LPWSTR LPTSTR;

    typedef LPCWSTR LPCTSTR;

#else

    typedef LPSTR LPTSTR;

    typedef LPCSTR LPCTSTR;

#endif 

3、相互转换方法

LPWSTR->LPTSTR:   W2T();
LPTSTR->LPWSTR:   T2W();
LPCWSTR->LPCSTR: W2CT();
LPCSTR->LPCWSTR: T2CW();

ANSI->UNICODE:     A2W();

UNICODE->ANSI:     W2A();

 

另外,CString转为CStringW方法(通过一个wchar_t数组来转)

 CString str;

 CStringW strw;
 wchar_t *text = new wchar_t[sizeof(wchar_t) * str.GetLength()];
 MultiByteToWideChar(CP_ACP,0,str,-1,text,str.GetLength());
 strw = text;

 

4、另外,还可以强行转换,不过不一定能成功

 

5、还有_bstr_t ( 对BTSTR的封装,需要#include<comdef.h> ),也可将单字节字符数组指针转为双字节字符数组指针,还没怎么没用到过。

 

 

==========================================================

typedef TCHAR
typedef LPTSTR

L、P、T的含义同上。

3.TCHAR:TCHAR其实是一个宏,其定义为:

1#ifdef UNICODE
typedef TCHAR;
4char 5#endif

也就是说,如果我们使用unicode编码,那么TCHAR指的就是wchat_t,如果我们使用的是ASCII编码,那么TCHAR指的就是char,这样处理的目的是为了程序的可移植性。T表示在Win32环境中, 有一个_T宏 。

4.WCHAR:WCHAR其实也是一个宏,表示的就是wchar_t,为了书写方便重新定义的一个宏而已,其定义为:

1wchar_t 
02b) swap()   //交换两个字符串的内容
04d) insert() //插入字符
06f) clear() //删除全部字符
08h) + //串联字符串
10j) size(),length()  //返回字符数量
12l) empty()  //判断字符串是否为空
14n) reserve() //保留一定量内存以容纳一定数量的字符
16p) >>,getline() //从stream读取某值
18r) copy() //将某值赋值为一个C_string
20t) data() //将内容以字符数组形式返回
22v)查找函数
24x) rbegin() rend() //逆向迭代器
wchar_t
char
02 
WCHAR                 wchar_t
LPSTR                 char*
LPCSTR                char*                         char*
LPWSTR                wchar_t*
LPCWSTR               wchar_t*                      wchar_t*
TCHAR                 wchar_t
LPTSTR                TCHAR*
LPCTSTR               TCHAR*                        TCHAR*

二.相互转化

1既然有定义了这么多的数据类型,所以他们之间的相互转化是少不了的。
1A):CString的转化
11.CString和
LPCTSTR不需要转化,两者是等价的,所以:
1CString str("cstring");
LPCTSTR pcStr = str;

2.CString和LPTSTR的转化:

下述转法虽然可以,但是却不安全:

1CString str("string");
LPTSTR pStr = (LPCTSTR)(str);

因为本来转化后的字符串变得可以修改了,造成了安全隐患。

正确的转化方法为:

1CString str("string");
LPTSTR pStr = str.GetBuffer();
23wcscpy(pWchar,str);

方法二:使用wcscpy_s()函数

这个函数是上一个函数的安全版本,调用上一个函数如果pWchar的内存不足时,容易引发意味的错误,但是wcscpy_s()则不会,应该其内存大小已经指定出来了:

1CString str("string");
WCHAR pWchar[100];
23_tcscpy(pStr,str);

方法四:使用_tcscpy_s()函数

同wcscpy_s()一样,_tcscpy_s()函数也是_tcscpy()函数的安全版本:

1CString str("string");
WCHAR pStr[100];
23<code bold"="">wcstombs(pChar,str,100);

方法二:使用wcstombs_s()函数

同上面一样,wcstombs_s()是wcstombs()的安全版本:

总结:

      上面一会使用strcpy(),一会使用wcscpy(),一会又使用_tcscpy(),这三者有什么关系呢,其实strcpy()处理的就是 ASCII编码的字符,像char,而wcscpy()处理的是Unicode 编码,_tcscpy()则是一个宏,如果你使用的是ASCII编码,那么_tcscpy()表示的就是strcpy(),如果你使用的是Unicode 编码,那么_tcscpy()表示的就是wcscpy(),这可以通过定义_UNICODE或UNICODE宏来实现。你可能已经知道了为什么要定义这么 一个宏,对!就是为了代码的移植。还有一个函数就是wcstombs(),这个函数是干什么用的呢?其实除了Unicode编码,还有一个编码,那就是多 字节编码,通常用的是双字节编码,vc就支持这种编码,函数wcstombs()就是为了实现多字节和单字节转换而设计的

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 脸上发红发痒起疙瘩怎么办 脸过敏了怎么办最简单 胸下垂应该怎么办19岁 身上的肉特别松怎么办 才30岁脸部松弛怎么办 脸上的皮肤很松怎么办 面部皮肤干燥起皮刺痛怎么办 脸上的皮肤很粗糙怎么办 脸上又红又痒怎么办 鲜红斑痣增生了怎么办 激光祛斑后色素沉着怎么办 白球鞋洗后发黄怎么办 夏天出汗妆花了怎么办 买的小产权房怎么办 嘴唇起皮怎么办小妙招 照相嘴巴是歪的怎么办 鼻子笑起来很宽怎么办 财运不好怎么办最近你有偏财 从小缺爱的人怎么办 一到晚上就怕死怎么办 碰到不讲理的人怎么办 遇到不讲理的人怎么办 蚰蜓虫子咬了怎么办 腰肌损伤怎么办恢复快 腰闪了怎么办最有效 墨兰严重烂根怎么办 铁兰花变绿了怎么办 1岁半宝宝吵瞌睡怎么办 28天宝宝吵瞌睡怎么办 2个月宝宝闹瞌睡怎么办 被刺猬的刺扎了怎么办 买电脑被坑了怎么办 买电脑被坑了怎么办啊 在电脑城被坑了怎么办 小狗20天不睁眼怎么办 金星秀停播沈南怎么办 干了活拿不到钱怎么办 干完活要不到钱怎么办 让蚊子咬了很痒怎么办 秋天被蚊子咬了怎么办 练芭蕾脚背太硬怎么办