字符串的学习 之一基本理论学习

(本文来源参考windows核心编程)
一)单字节字符集
一直来,许多人一直将文本串作为一系列单字节字符来进行编码,并在结尾处放上一个零。对于我们来说,这已经成了习惯。当调用strlen函数时,它在以0结尾的单字节字符数组中返回字符的数目。问题是,有些文字和书写规则的字符集中的符号太多了,因此单字节(它提供的符号最多不能超过2 5 6个)是根本不敷使用的。为此出现了双字节字符集(DBCS)。

二)双字节字符集(DBCS)
双字节字符集(DBCS),支持所有这些文字和书写规则。但是使用双字节字符集,对于程序员来说简直是个很大的难题,因为有些字符只有一个字节宽,而有些字符则是两个字节宽。

三)U n i c o d e
对于双字节字符集(DBCS)的不足,又提出了Unicode字符集。
Unicode提供了一种简单而又一致的表示字符串的方法。Unicode字符串中的所有字符都是16位的(两个字节)。

四)为什么使用Unicode
当开发应用程序时,当然应该考虑利用Unicode的优点。即使现在你不打算对应用程序进行本地化(国际化),开发时将Unicode放在心上,肯定可以简化将来的代码转换工作。此外, Unicode还具备下列功能:
1 可以很容易地在不同语言之间进行数据交换。
2 使你能够分配支持所有语言的单个二进制. exe文件或DLL文件。
3 提高应用程序的运行效率。

关于提高应用程序的运行效率:
Windows 2000
Windows 2000是使用U n i c o d e从头进行开发的,用于创建窗口、显示文本、进行字符串操作等的所有核心函数都需要U n i c o d e字符串。如果调用任何一个Wi n d o w s函数并给它传递一个A N S I字符串,那么系统首先要将字符串转换成U n i c o d e,然后将U n i c o d e字符串传递给操作系统。如果希望函数返回A N S I字符串,系统就会首先将U n i c o d e字符串转换成A N S I字符串,然后将结果返回给你的应用程序。所有这些转换操作都是在你看不见的情况下发生的。当然,进行这些字符串的转换需要占用系统的时间和内存。

Windows CE
Windows CE就是使用U n i c o d e的一种操作系统。但是,为了使Windows CE尽量做得小一些,M i c r o s o f t公司决定完全不支持ANSI Wi n d o w s
函数。因此,如果要为Windows CE开发应用程序,必须懂得U n i c o d e,并且在整个应用程序中使用U n i c o d e。

COM
当M i c r o s o f t公司将C O M从1 6位Wi n d o w s转换成Wi n 3 2时,公司作出了一个决定,即需要字符串的所有C O M接口方法都只能接受U n i c o d e字符串。

五)如何编写U n i c o d e源代码
Microsoft公司为U n i c o d e设计了Windows API,这样,可以尽量减少对你的代码的影响。实际上,你可以编写单个源代码文件,以便使用或者不使用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的支持
若要创建ANSI/Unicode通用源代码文件,请使用TChar. h文件。
若要定义一个ANSI/Unicode通用的字符串数组,请使用下面的TCHAR数据类型。

strcat wcscat;
strchr wcschr;
strcpy wcscpy;
strlen wcslen;

对于包含了对s t r函数(单字节)或w c s函数(双字节)进行显式调用的代码来说,无法非常容易地同时为A N S I和U n i c o d e对这些代码进行编译。本章前面说过,可以创建同时为A N S I和U n i c o d e进行编译的单个源代码文件。若要建立双重功能,必须包含T C h a r. h文件,而不是包含S t r i n g . h文件。
T C h a r. h文件的唯一作用是帮助创建A N S I / U n i c o d e通用源代码文件。它包含你应该用在源代码中的一组宏,而不应该直接调用s t r函数或者w c s函数。如果在编译源代码文件时定义了_ U N I C O D E,这些宏就会引用w c s这组函数。如果没有定义_ U N I C O D E,那么这些宏将引用s t r这组宏。
例如,在T C h a r. h中有一个宏称为_ t c s c p y。如果在包含该头文件时没有定义_ U N I C O D E ,那么_ t c s c p y就会扩展为A N S I的s t r c p y函数。但是如果定义了_UNICODE, _tcscpy将扩展为U n i c o d e的w c s c p y函数

字符串(literal string)前面的大写字母L,用于告诉编译器该字符串应该作为U n i c o d e字符串来编译。使用_TEXT宏以便有选择地在字符串的前面加上大写字母L。_TEXT宏可以用于字符串和字符:
TCHAR *pCh = _TEXT("test");  if(sz[0] == _TEXT('J'))

七)理解LPCTSTR类型
L表示long指针
这是为了兼容Windows 3.1等16位操作系统遗留下来的,在win32中以及其他的32为操作系统中, long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义。P表示这是一个指针。C表示是一个常量。T表示在Win32环境中, 有一个_T宏这个宏用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串。STR表示这个变量是一个字符串。

八)CreateWindowEx
CreateWindowExW CreateWindowExA
在Windows 2000下,M i c r o s o f t的C r e a t e Wi n d o w E x A源代码只不过是一个形实替换程序层或翻译层,用于分配内存,以便将A N S I字符串转换成U n i c o d e字符串。该代码然后调用C r e a t eWi n d o w E x W,并传递转换后的字符串。当C r e a t e Wi n d o w E x W返回时,C r e a t e Wi n d o w E x A便释放它的内存缓存,并将窗口句柄返回给你。如果要创建其他软件开发人员将要使用的动态链接库( D L L),请考虑使用下面的方法。在D L L中提供两个输出函数。一个是A N S I版本,另一个是U n i c o d e版本。在A N S I版本中,只需要分配内存,执行必要的字符串转换,并调用该函数的U n i c o d e版本

九)Wi n d o w s字符串函数
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。
若要使用这些函数,系统必须运行Windows 2000或Windows 98。如果安装了I n t e r n e tExplorer 4.0或更新的版本,也可以在较早的Wi n d o w s版本中获得这些函数。
在经典的操作系统函数样式中,操作系统字符串函数名既包含大写字母,也包含小写字母,它的形式类似这个样子: 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头文件。另外,如前所述,这些字符串函数既有A N S I版本,也有U n i c o d e版本,例如S t r C a t A和S t r C a t W。由于这些函数属于操作系统函数,因此,当创建应用程序时,如果定义了U N I C O D E(不带前置下划线),那么它们的符号将扩展为宽字符版本。

十)成为符合A N S I和U n i c o d e的应用程序
即使你不打算立即使用U n i c o d e,最好也应该着手将你的应用程序转换成符合U n i c o d e的应用程序。下面是应该遵循的一些基本原则:
1 将文本串视为字符数组,而不是c h a r s数组或字节数组。
2 将通用数据类型(如T C H A R和P T S T R)用于文本字符和字符串。
3 将显式数据类型(如B Y T E和P B Y T E)用于字节、字节指针和数据缓存。
4 将T E X T宏用于原义字符和字符串。
5 执行全局性替换(例如用P T S T R替换P S T R)。
6 修改字符串运算问题。例如函数通常希望你在字符中传递一个缓存的大小,而不是字节。
这意味着你不应该传递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 )。在上面所说的所有原则中,这是最难记住的一条原则,如果操作错误,编译器将不发出任何警告。

十一)Wi n d o w s字符串函数
Wi n d o w s也提供了一组用于对U n i c o d e字符串进行操作的函数,
lstrcat
lstrcmp
lstrcmpi
lstrcpy
lstrlen
这些函数是作为宏来实现的,这些宏既可以调用函数的U n i c o d e版本,也可以调用函数的A N S I版本,这要根据编译源代码模块时是否已经定义了U N I C O D E而定。

十二)资源
当资源编译器对你的所有资源进行编译时,输出文件是资源的二进制文件。资源(字符串表、对话框模板和菜单等)中的字符串值总是写作U n i c o d e字符串。在Windows 98和Wi n d o w s2 0 0 0下,如果应用程序没有定义U N I C O D E宏,那么系统就会进行内部转换。例如,如果在编译源代码模块时没有定义U N I C O D E,调用L o a d S t r i n g实际上就是调用L o a d S t r i n g A函数。这时L o a d S t r i n g A就从你的资源中读取字符串,并将该字符串转换成A N S I字
符串。A N S I形式的字符串将从该函数返回给你的应用程序。

十三)确定文本是A N S I文本还是U n i c o d e文本
I s Te x t U n i c o d e函数能够帮助进行这种区分。
文本文件存在的问题是,它们的内容没有严格和明确的规则,因此很难确定该文件是包含A N S I字符还是U n i c o d e字符。I s Te x t U n i c o d e使用一系列统计方法和定性方法,以便猜测缓存的内容。由于这不是一种确切的科学方法,因此I s Te x t U n i c o d e有可能返回不正确的结果。

十四)在U n i c o d e与A N S I之间转换字符串
Wi n d o w s函数MultiByteToWideChar用于将多字节字符串转换成宽字符串。
WideCharToMultiByte将宽字符串转换成等价的多字节字符串

转载于:https://www.cnblogs.com/zkliuym/archive/2008/03/13/1103488.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值