Unicode和MBCS

2012年7月8日 | 分类: 日志 | 标签:

本文内容整理自微软msdn文档和维基百科,建议先了解UnicodeWindows代码页的相关知识。

Windows NT系列之前,例如Windows 95系统是原生的八位字符的操作系统,即处理字符串是每次处理一个字节。东亚版本的Windows 95系统成为多字节字符集(MBCS)系统,因为它们使用一个前导字节和一个尾字节将字符集扩展到256个以上(ANSI ASCII码只用了前面7个bit)。

Windows NT的操作系统是原生支持Unicode的,文本的基本表示是UTF-16,WCHAR的数据类型是UTF-16编码(准确的说是UCS-2,UTF-16可以看成是UCS-2的父集,在UNICODE辅助平面字符出来前,UTF-16与UCS-2是一样的)。

Win32 API里所有文本参数作为输入或输出变量的接口都有一个通用函数原型和两个定义:一个基于代码页(ANSI)的版本(称为’A’)处理代码页文本,一个宽版本(称为’W’)处理Unicode。通用函数原型包括宏形式的标准 API 函数名称。通用原型解析为一种显式函数原型(”A” 或 “W”),具体取决于编译时明示常量 UNICODE 是否是在 #define 语句中定义。在显式函数原型中,字母 “W” 或 “A” 添加在 API 函数名称的结尾处

// windows.h
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif // UNICODE

DBCS:Windows系统上支持称为双字节字符集 (DBCS) 的多字节字符集 (MBCS) 形式。在Visual C++里,MBCS始终是指DBCS,不支持比两个字节宽的字符集。对应的还有单字节字符集SBCS,例如Windows系统里使用的CP1252。用于中文的CP936则是DBCS。

MBCS应用程序可以在任何Win32平台运行,但是依赖于系统区域语言设置(代码页)。具体问题可以参考上一篇《Windows代码页》中代码页的问题。

参考资料:

http://support.microsoft.com/kb/210341/
http://msdn.microsoft.com/zh-cn/library/cwe8bzh0%28v=vs.80%29.aspx
http://msdn.microsoft.com/zh-cn/library/5z097dxa%28v=VS.80%29.aspx
http://msdn.microsoft.com/zh-cn/subscriptions/downloads/dd317752.aspx

目前还没有任何评论.

[cusFace:84] [cusFace:83] [cusFace:82] [cusFace:79] [cusFace:67] [cusFace:66] [cusFace:65] [cusFace:54] [cusFace:53] [cusFace:52] [cusFace:51] [cusFace:50] [cusFace:49] [cusFace:48] [cusFace:47] [cusFace:44] [cusFace:43] [cusFace:42] [cusFace:41] [cusFace:40] [cusFace:39] [cusFace:38] [cusFace:37] [cusFace:36] [cusFace:35] [cusFace:34] [cusFace:33] [cusFace:32] [cusFace:31] [cusFace:30] [cusFace:29] [cusFace:28] [cusFace:27] [cusFace:26] [cusFace:25] [cusFace:24] [cusFace:23] [cusFace:22] [cusFace:21] [cusFace:20] [cusFace:19] [cusFace:18] [cusFace:17] [cusFace:16] [cusFace:15] [cusFace:14] [cusFace:13] [cusFace:12] [cusFace:11] [cusFace:10] [cusFace:09] [cusFace:08] [cusFace:07] [cusFace:06] [cusFace:05] [cusFace:04] [cusFace:03] [cusFace:02] [cusFace:01] [cusFace:00]