VS中的字符串(Unicode/ANSI)操作和类属性设置

VS中的字符串(Unicode/ANSI)操作和类属性设置

1、在VS2005中,所有的字符都为Unicode,所以每一个字符串都因该加上_T("xxx")。_T是一个宏,如果定义了Unicode,_T("x")就相当于L"x",这是宽字符,如果没有定义Unicode,_T("x")就相当于"x"。

    在VS中,_T(x)如下定义:

#define _T(x)       __T(x)

#define __T(x)      L ## x

当然,这个问题的引出主要是在VS中编译时遇到的:const char toLPCTSTR不能转化问题。微软给我们提供了两个方法:

   1)Change your project configuration to use multibyte strings. Press ALT+F7 to open the

 properties, and navigate to Configuration Properties > General. Switch Character Set to "Use 

Multi-Byte Character Set".

    即在属性设置,常规中,字符集选择“使用多字节字符集”,而不是默认的"Unicode字符集"。

   2)Indicate that the string literal, in this case "Hello world!" is of a specific encoding. This can 

be done through either prefixing it with L, such as L"Hello world!", or surrounding it with the 

generic _T("Hello world!") macro. The latter will expand to the L prefix if you are compiling for 

unicode (see #1), and nothing (indicating multi-byte) otherwise.

这一种方法,也就是我们上面提到的加宏_T()。

2、如何理解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的类型定义。如下定义:

    LPCTSTR == const TCHAR *

CString 和 LPCTSTR 可以通用。因为CString定义的自动类型转换(C++操作符重载)。

常量字符串ansi和unicode的区分是由宏_T来决定的。但是用_T("abcd")时,字符串"abcd"就会根据编译时的是否定义了UNICODE来决定是char*还是 w_char*。同样,TCHAR也是相同目的字符宏。

    ansi情况下,LPCTSTR 就是 const char*,是常量字符串(不能修改的)。而LPTSTR就是char*,即普通字符串(非常量,可修改的)。这两种都是基本类型, 而CString是C++类,兼容这两种基本类型。由于const char*最简单(常量,不涉及内存变更,操作迅速),CString 直接定义了一个类型转换函数operator LPCTSTR() {......},直接返回他所维护的字符串。当需要一个const char*而传入了CString时,C++编译器自动调用CString重载的操作符 LPCTSTR()来进行隐式的类型转换。当需要CString ,而传入了const char*时(其实char*也可以),C++编译器则自动调用CString的构造函数来构造临时的CString对象。因此CString 和 LPCTSTR 基本可以通用。

但是LPTSTR不同,是char*,意味着随时可能修改里面的数据,这就需要内存管理(如字符串变长,原来的存贮空间就不够了,则需要重新调整分配内存)。所以不能随便的将const char*强制转换成char*使用。如果确认字符串不被修改,则应当声明成const型。

CString转换到LPTSTR(char*), 预定的做法是调用CString的GetBuffer函数,使用完之后一般都要再调用ReleaseBuffer函数来确认修改(某些情况下也有不调用ReleaseBuffer的,需要非常明确为什么这么做时才能这样子处理,一般应用环境可以不考虑这种情况)。

同时需要注意的是,在GetBuffer和ReleaseBuffer之间,CString分配了内存交由你来处理,因此不能再调用其他的CString函数。

    CString转LPCTSTR:

    CString cStr;

    const char *lpctStr=(LPCTSTR)cStr;

    LPCTSTR转CString:

    LPCTSTR lpctStr;

CString cStr=lpctStr;

3、列出几个常用类型的英文释义:

1)LPCSTR   A 32-bit pointer to a constant character string

2)LPSTR   A 32-bit pointer to a character string.

3)LPCTSTR   A 32-bit pointer to a constant character string that is portable for Unicode and DBCS.

4)LPTSTR   A 32-bit pointer to a character string that is portable for Unicode and DBCS.

4、VS2005中,测定宽字符长度的函数是wcslen,而不是strlen。

5、VS中,项目属性(Alt+F7),类属性(双击选定类,Alt+Enter)。一般在类属性中,可以添加消息、事件等。

6、Unicode

Unicode(统一码、万国码、单一码、标准万国码)是业界的一种标准,它可以使电脑得以呈现世界上数十种文字的系统。Unicode是基于通用字符集(Universal Character Set)的标准来发展而来。Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个码位。码位就是可以分配给字符的数字。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。

7、ANSI

为使计算机支持更多语言,通常使用0x80~0xFF范围的2个字节来表示1个字符。比如:汉字'中'在中文操作系统中,使用 [0xD6,0xD0] 这两个字节存储。

不同的国家和地区制定了不同的标准,由此产生了GB2312,BIG5,JIS 等各自的编码标准。这些使用2个字节来代表一个字符的各种汉字延伸编码方式,称为ANSI编码。在简体中文系统下,ANSI编码代表 GB2312编码,在日文操作系统下,ANSI编码代表JIS编码。

正是由于ANSI所面临的问题,才发展提出了Unicode。

参考:

1、http://blog.csdn.net/tunnel115/archive/2009/01/05/3710935.aspx

2、百度百科,SOSO百科

3、http://kb.cnblogs.com/a/1397538/

4、MSDN

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值