Programming Windows 笔记:An Introduction to Unicode (二)

本文为《Programming Windows, Fifth Edition》(Charles Petzold 著)第2章 “An Introduction to Unicode” 的学习笔记总结。


维护单一源代码

一种解决办法是使用微软Visual C++自带的TCHAR.H头文件。该头文件不属于ANSI C标准范畴,因此其中定义的所有函数与宏定义名称均以下划线开头。 TCHAR.H 为常规需要传入字符串参数的运行时库函数提供了一套别名(例如:_tprintf_tcslen)。这类名称有时被称作「通用」函数名,因为它们既可以对应函数的Unicode版本,也可以适配非Unicode版本。

例如,如果定义了 _UNICODE 标识符,则会按如下方式定义名为 __T 的宏:

1
#define __T(x) L##x

这个语法属于ANSI C标准中C预处理器的规范内容。这组双井号被称为 标记拼接符,作用是将字母L追加到宏参数。因此,若宏参数为“Hello!”,那么 L##x 就会等效为 L"Hello!"。 如果未定义 _UNICODE 标识符,则 __T 宏将按以下方式简单定义:

1
#define __T(x) x

另外两个宏被定义为与 __T 等同:

1
2
#define _T(x) __T(x)
#define _TEXT(x) __T(x)

_T_TEXT 宏内部定义字符串字面量:

1
_TEXT ("Hello!")

如果定义了 _UNICODE 标识符,这样操作会将字符串解析为宽字符组成;若未定义该标识符,则会将其解析为8位字符。


UNICODE vs _UNICODE

Microsoft Visual Studio 里,_UNICODE 是一个预处理宏,通常和 UNICODE 一起控制是否使用宽字符(UTF-16)版本的 Windows API。

作用
UNICODE 控制 Windows API(如 CreateFileCreateFileW
_UNICODE 控制 C 运行库(如 _tprintf

在 Visual Studio 里:启用了 Unicode 字符集会自动添加 UNICODE;_UNICODE 宏。