Windows核心编程笔记:字符和字符串处理(CH2)

想要深入Windows应用开发,这本书想必是必读的。这个系列只是粗略地将一些笔者认为比较重要的知识点记下来,可供读者参考,但并不推荐用来逃课~
Windows核心编程笔记:字符和字符串处理(CH2)

1.大写字母L通知编译器该字符串应当编译为一个Unicode字符串(UTF-16)
2.Windows NT 开始,Windows函数都需要Unicode字符串。若传入ANSI字符串,会在幕后转换为Unicoide处理,会有一定开销。
3.如果一个Windows函数参数有字符串,通常同时提供ANSI版本和Unicode版本,如

HWND WINAPI CreateWindowExA(
    DWORD dwExStyle,
    PCWSTR pClassName, //P-指针,C-常量,W-宽字节,即是宽字节的字符串常量
    PCWSTR pWindowsName, //宽字节字符串使用Unicode编码
    ...);

HWND WINAPI CreateWindowExA(
    DWORD dwExStyle,
    PCSTR pClassName, //PCSTR即是单字节的字符串常量
    PCSTR pWindowsName, //单字节字符串使用ANSI编码
    ...);

但通常建议使用Unicode版本,理由如下:
①根据上文,传入ANSI字符串会导致额外开销。
②底层ANSI转Unicode的底层函数,可能会有BUG(书上这么写的,我有点无语。。)。
③有一些函数只提供Unicode版本。
④COM接口方法只接受Unicode。在程序中全面使用Unicode可以使得与COM的交互更容易。

除了调用Windows函数外,其余开发场景也应使用Unicode,主要理由有:
①Unicode有利于应用程序的本地化。(Unicode支持各种语言)

软件本地化是指将某一产品的用户界面(UI)和辅助材料(文档资料和在线帮助菜单)从其原产国语言向另一种语言转化,使之适应某一外国语言和文化的过程。Qt中提供Qt Linguist工具去解决 国际化问题。

②资源中的字符串是Unicode形式的,使用Unicode能够更容易地使用和操控资源。
③更容易与使用Unicode字符串的 .Net Framework交互。

字符和字符串处理原则:
①开始将文本字符想象为字符的数组,而不是char或字节的数组。换句话说,即是在使用字符串时,要考虑字符编码问题。
②使用通用数据类型(如TCHAR/PTSTR)来表示文本字符和字符串。
③使用TEXT或_T宏来表示字面量字符和字符串,明确其编码。该宏的用处在于会根据编译条件的设置,选择不同的编码格式。Windows编程中编译器的设置为Unicode。
④始终使用安全的字符串处理函数,避免内存的错误写入,比如后缀为_s的函数(C运行时库函数),或前缀为StringCch的函数(Windows APIs)。

4.文本文件的问题在于,它们的内容没有任何硬性的、可供快速判断的规则。所以,要判断
文件中包含的是ANSI字符还是Unicode字符,就显得相当困难。IsTextUnicode函数使用
一系列统计性和确定性方法来猜测缓冲区中的内容。由于这种方法并不精确,因此
IsTextUnicode函数可能会返回错误的结果。

所以有时候会发现,用Windows自带的记事本或者任何其他的编辑器(Visual Studio, Notepad等),都有可能乱码的情况。本质就是识别编码类型识别错了。

Reference:
Windows核心编程(第五版) ——Jeffrey Richer

你可能感兴趣的:(Windows核心编程笔记:字符和字符串处理(CH2))