首页 > 代码库 > MFC基础--C++中的字符集(转自MSDN)http://msdn.microsoft.com/zh-cn/library/06b9yaeb(v=vs.90).
MFC基础--C++中的字符集(转自MSDN)http://msdn.microsoft.com/zh-cn/library/06b9yaeb(v=vs.90).
为国际市场开发应用程序的一个重要方面就是要适当地表示本地字符集。ASCII 字符集在 0x00 到 0x7F 的范围内定义字符。还有其他一些字符集(主要是欧洲字符),它们在 0x00 到 0x7F 的范围内定义与 ASCII 字符集相同的字符,还在 0x80 到 0xFF 的范围内定义了扩展字符集。因此,8 位的单字节字符集 (SBCS) 足以表示 ASCII 字符集以及许多欧洲语言的字符集。但是,一些非欧洲字符集(如日文汉字)包含许多单字节代码方案无法表示的字符,因此要求使用多字节字符集 (MBCS) 编码。
Unicode 和 MBCS
为支持国际编程,启用了 Microsoft 基础类库 (MFC)、Visual C++ 的 C 运行时库和 Visual C++ 开发环境。它们:
在 Windows 2000(以前为 Windows NT)上提供对 Unicode 标准的支持。
Unicode 是为所有语言提供足够编码的 16 位字符编码。所有 ASCII 字符都作为“加宽”字符包含在 Unicode 中。
说明: Windows 95、Windows 98 或 Windows Millennium Edition 上不支持 Unicode 标准。
在所有平台上,支持称为双字节字符集 (DBCS) 的多字节字符集 (MBCS) 形式。
DBCS 字符由一个或两个字节构成。某些范围的字节留出用作“前导字节”。前导字节指定由它和后面的“尾字节”构成单个双字节宽字符。必须清楚哪些字节是前导字 节。在某个多字节字符集内,前导字节位于某个特定范围内,尾字节也一样。当这两种范围重叠时,可能需要计算上下文以确定某个给定的字节是用作前导字节还是 尾字节。
对简化 MBCS 编程的工具提供支持(MBCS 编程用于为国际市场编写的应用程序)。
当在支持 MBCS 的 Windows 操作系统版本上运行时,Visual C++ 开发系统(包括集成的源代码编辑器、调试器和命令行工具)完全支持 MBCS。有关更多信息,请参见 Visual C++ 中的 MBCS 支持。
说明: 在本文档中,MBCS 用于描述所有对多字节字符的非 Unicode 支持。在 Visual C++ 中,MBCS 始终是指 DBCS。不支持比两个字节宽的字符集。
按照定义,ASCII 字符集是所有多字节字符集的子集。在许多多字节字符集中,0x00 到 0x7F 范围内的每个字符都与 ASCII 字符集中具有相同值的字符相同。例如,在 ASCII 和 MBCS 字符串中,单字节 NULL 字符(“\0”)的值都是 0x00 并且指示终止空字符。
国际支持
大多数传统的 C 和 C++ 代码采用不适用于国际应用程序的字符和字符串操作。虽然 MFC 和运行时库都支持 Unicode 或 MBCS,但您仍需要亲自做一些工作。为指导您,本节解释 Visual C++ 中“国际支持”的含义:
通过 MFC 函数参数列表和返回类型中的可移植数据类型来支持 Unicode 和 MBCS。根据您的版本是否定义了 _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(如日语)的语言也很独特。由于一个字符可能由单字节或双字节组成,因此应始终同时处理两个字节。 |