认识字符集(ANSI、Unicode)

ANSI:单字节字符
Unicode:双字节字符

WINDOWS系统对字符集的支持:
• Windows 2000 既支持U n i c o d e ,也支持A N S I ,因此可以为任意一种开发应用程序。
• Windows 98 只支持A N S I ,只能为A N S I 开发应用程序。
• Windows CE 只支持U n i c o d e ,只能为U n i c o d e 开发应用程序。
操作系统在使用不同的字符集时要进行字符转换,如win2000系统,如果程序函数中使用了ANSI字符集,系统需要将其转换成Unicode再执行,如 果函数返回也是ANSI字符,则返回结果再从Unicode转换为ANSI。因此如果你开发的程序运行在WIN2000下,请用Unicode字符集,这 将获得更快执行速度、更节省资源。

定义不同的字符集:
• wchar_t:标准的C 头文件S t r i n g . h 定义了Unicode字符定义typedef unsigned short wchar_t

处理不同字符集的函数:
t r c p y 、s t r c h r 和s t r c a t 等,只能对A N S I 字符串进行操作,不能正确地处理U n i c o d e 字符串。因此,ANSI C 也拥有一组补充函数,如上面函数对应的是wcschr、wcs c h r 和wcsc a t 。
所有的U n i c o d e 函数均以w c s 开头,w c s 是宽字符串的英文缩写。若要调用U n i c o d e函数,只需用前缀w c s 来取代A N S I 字符串函数的前缀s t r 即可。

通用的程序开发:
如果你不能确定你的程序运行环境,虽然提倡使用Unicode字符集,但如果有时要运行在win98下呢?因此你可能需 要开发一种可在两种环境都可运行的程序。

认识两个宏(U N I C O D E 和_ U N I C O D E)
_U N I C O D E 宏用于C 运行期头文件,而U N I C O D E 宏则用于Wi n d o w s 头文件。有些函数的运行过程视乎这个宏的定义,如果定义了(_UNICODE或UNICODE,不同环境下使用,不要混了),这些函数处理Unicode 字符集,否则处理ANSI字符集。

认识TCHAR:
如果定义了_ U N I C O D E ,T C H A R 将声明为下面的形式:
typedef wchar_t TCHAR;
如果没有定义_ U N I C O D E ,则T C H A R 将声明为下面的形式:
typedef char TCHAR;

认识 L、_T:
我们经常看到程序里面有如L"this is a wchar"、_T("this is a TCHAR")的字符定义,需要注意的是L表明这些字符是Unicode的,而_T则表明这些字符是Unicode还是ANSI要看是否定义了 _UNICODE宏。

通用 字符集处理函数:
如_ t c s c p y函数,如果定义了_UNICODE宏,他就是strcpy,如果没有定义它就是wcscpy。

WINDOWS中定义字符:
尽管WINDOWS中定义了很多字符串类型,但有规律的,注意观察体会下就可以了。举几个例子:
LPSTR      :   char*
LPCSTR    :   const char*
LPWSTR   :   wchar_t*
LPCWSTR : const wchar_t*
LPTSTR     : TCHAR*
LPCTSTR   : const TCHAR*
注意其中的C、W、T,看出规律了吧
有时你会看到前面不是LP,而是P,如PSTR。在WIN16时代有长指针(LP)与短指针(P)之别,现在两者是一样的了。

认识一些函数名的 后缀:
举例子说明:
CreateWindowExW:处理Unicode字符集的
CreateWindowExA:处理ANSI字符集的
通常我们只用CreateWindowEx,它会根据是否定义宏UNICODE来决定使用哪个函数

Windows字 符串函数:
Wi n d o w s 还提供了一组范围很广的字符串操作函数。这些函数与C 运行期字符串函数(如s t r c p y 和w c s c p y )很相似。但是该操作系统函数是操作系统的一个组成部分,操作系统的许多组件都使用这些函数,而不使用C 运行期库。建议最好使用操作系统函数,而不要使用C 运行期字符串函数。这将有助于稍稍提高你的应用程序的运行性能,因为操作系统字符串函数常常被大型应用程序比如操作系统的外壳进程E x p l o r e r. e x e 所使用。由于这些函数使用得很多,因此,在你的应用程序运行时,它们可能已经被装入R A M 。
在经典的操作系统函数样式中,操作系统字符串函数名既包含大写字母,也包 含小写字母,它的形式类似这个样子:S t r C a t 、S t r C h r 、S t r C m p 和S t r C p y 等。若要使用这些函数,必须加上S h l WA p i . h 头文件。

l s t r c a t     将一个字符串置于另一个字符串的结尾处
l s t r c m p   对两个字符串进行区分大小写的比较
l s t r c m p i 对两个字符串进行不区分大小写的比较
l s t r c p y     将一个字符串拷贝到内存中的另一个位置
l s t r l e n      返回字符串的长度(按字符数来计量)

大小写转换:
t o l o w e r 和t o u p p e r :可能对某些Unicode字符支持不好,请用另外的两个windows函数代替:
PTSTR CharLower(PTSTR pszString);
PTSTR CharUpper(PTSTR pszString);

成为符合ANSI 和Unicode的应用程序建议:
即使你不打算立即使用U n i c o d e ,最好也应该着手将你的应用程序转换成符合U n i c o d e 的应用程序。下面是应该遵循的一些基本原则:

• 将文本串视为字符数组,而不是c h a r s 数组或字节数组。
• 将通用数据类型(如T C H A R 和P T S T R )用于文本字符和字符串。
• 将显式数据类型(如B Y T E 和P B Y T E )用于字节、字节指针和数据缓存。
• 将T E X T 宏用于原义字符和字符串。
• 执行全局性替换(例如用P T S T R 替换P S T R )。
• 修改字符串运算问题。例如函数通常希望你在字符中传递一个缓存的大小,而不是字节。

这意味着你不应该传递s i z e o f ( s z B u ff e r ) ,而应该传递(s i z e o f ( s z B u ff e r ) / s i z e o f ( T C H A R )。另外,如果需要为字符串分配一个内存块,并且拥有该字符串中的字符数目,那么请记住要按字节来分配内存。这就是说,应该调用 malloc(nCharacters *sizeof(TCHAR)),而不是调用m a l l o c( n C h a r a c t e r s )。在上面所说的所有原则中,这是最难记住的一条原则,如果操作错误,编译器将不发出任何警告。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值