国际支持
大多数传统的 C 和 C++ 代码都假设字符和字符串操作不适用于国际应用程序。 虽然 MFC 和运行时库都支持 Unicode 或 MBCS,但仍需完成一些工作。 为了提供指导,本节讲解了 Visual C++ 中“国际支持”的含义:
Unicode 和 MBCS 均通过 MFC 函数参数列表中的可移植数据类型和返回类型启用。 这些类型以适当的方式有条件地定义,具体取决于生产定义的是
_UNICODE
符号还是_MBCS
符号(表示 DBCS)。 MFC 库的不同变体会自动与应用程序链接,具体取决于生成定义的是这两个符号中的哪一个。类库代码使用可移植运行时函数和其他方法来确保正确的 Unicode 或 MBCS 行为。
依旧必须在代码中处理某些类型的国际化任务:
使用相同的可移植运行时函数,使 MFC 在任一环境中都可移植。
使用
_T
宏使文本字符串和字符在任一环境中都可移植。 有关详细信息,请参阅 tchar.h 中的一般文本映射。在 MBCS 下分析字符串时采取预防措施。 在 Unicode 下,不需要这些预防措施。 有关详细信息,请参阅 MBCS 编程提示。
在应用程序中混合 ANSI (8 位) 和 Unicode (16 位) 字符时,请小心谨慎。 可以在程序的某些部分使用 ANSI 字符,并在其他部分中使用 Unicode 字符,但不能在同一字符串中混合使用它们。
不要在应用程序中硬编码字符串。 而是将字符串添加到应用程序的 .rc 文件,使其成为 STRINGTABLE 资源。 然后,无需更改源代码或重新编译即可本地化应用程序。 有关 STRINGTABLE 资源的详细信息,请参阅字符串编辑器。
注意
欧洲和 MBCS 字符集具有一些字符(例如重音字母),字符代码大于 0x80。 因为大多数代码都使用带符号的字符,所以这些大于 0x80 的字符在转换为 int
时进行带符号扩展。 对于数组索引来说,这是一个问题,因为带符号扩展字符(负数)在数组外部进行索引。 使用 MBCS 的语言(如日语)也是唯一的。 由于字符可能包含 1 或 2 个字节,因此应始终同时操作这两个字节。