windows核心编程心解--字符和字符串处理

来源:互联网 发布:女性必知的妇科小知识 编辑:程序博客网 时间:2024/05/17 20:01

程序一贯使用Unicode字符串有很多好处。

处理字符串需要注意的重要问题是安全问题,就是处理字符串时发生缓冲区溢出的问题,要引起关注。也就是使用处理字符串的函数尽量使用可以检测缓冲区溢出的函数。

一直以来,本地化的核心问题就是处理不同字符集的问题。

用于表示字符的几个UTF标准:

        UTF-8、UTF-16、UTF-32(对于三者之间的区别和联系有待于以后补充)

关于字符串:

        c语言中使用char类型来表示一个8位的ANSI字符。

         c++编译器中提供了一个内建数据类型wchar_t,来表示一个UTF-16字符,声明并给这类型字符串或字符赋值时要前面加上L“”;

Windows定义了自己的数据类型,包含在头文件WinNT.h中。

        CHAR;

        和WCHAR

关于程序中使用数据类型的统一:

        最好使用windows数据类型,这些数据类型和MSDN相符合,增强了文件的可读性。

       使用WinNT.h文件中定义的数据类型和宏,可以做到在asci和unicode下都可以编译通过。

——————————————————————————————————————————————

windows中的大部分函数都有两个版本:

        例如函数CreateWindowsEx().其实他是有两个版本CreateWindowsExW()和CreateWindowsExA().平时使用时,这个函数在WinUser.h头文件中定义了一个宏。

就是说程序会自动匹配,调用哪个。

——————————————————————————————————————————————

Microsoft将COM(有待于研究什么意思)从16位windows移植到32位时,决定:所有需要字符串作为参数的COM接口方法都只接受Unicode字符串。

16位的只接受ansi字符串,比如有些函数就是为了兼容16位,(WinExec和OpenFile)遇到这些函数时尽量使用(CreateProcess和CreateFile)来替换。

 ——————————————————————————————————————————————

c语言中,针对不属于c++部分的标识符,c运行库始终会为他们附加下划线前缀,比如c中本身属于String.h中的strlen和wcslen以及strcpy和wcscpy,应该尽量使用取代函数在TChar.h中定义了宏_tcslen(),这样无论ansi和unicode都可以编译通过。和windows中的wcscat函数。获取字节数使用sizeof函数。

新的安全字符串处理函数:

        包含在头文件StrSafe.h中,函数名称都在后面添加了一个_s做为标识。或者c运行库中还增加了一些函数,以StringCch或StringCb为前缀的函数,用于在执行字符串是可以获的更多的控制,比如截断字符串和填充符等。程序总应该尽量使用这些函数。

——————————————————————————————————————————————

与字符串有关的计算:

        内存是以字节来分配。可以通过定义宏来避免错误,

        包含在头文件stdlib.h中,_countof可以计算出缓存区的大小的字符数。malloc来计算字节数。(有待测试)

编译器执行运行时检查,自动检查缓存区是否溢出。(有待进一步理解)

——————————————————————————————————————————————

windows字符串处理函数:

        比较字符串进行相等性测试或者进行排序,使用函数CompareString(EX)和CompareStringOrdinal。

        得到主调线程的区域设置ID(LCID),使用函数GetThreadLocale。

        比较程序内部所用的字符串(如路径名、注册表值、xml值等),使用函数ComparestringOrdinal。

———————————————————————————————————————————————

关于Unicode和ansi字符串转换:

       参考本博客空间中的文章《关于字符串的相互转换问题(全)》

———————————————————————————————————————————————

判断文本文件编码格式:

      第一种方法,可以使用StdioFileEx.cpp文件(有待研究内部机制)

      第二种方法,使用函数IsTextUnicode。

原创粉丝点击