1.三种编码方式和三种字符类型。
- 第一种编码方式是单字节字符集,称之为 SBCS,它的所有字符可用一个字节存储。ASCII 码就是SBCS。SBCS字符串由一个零字节结尾。
- 第二种编码方式是多字节字符集,称之为 MBCS,它包含的字符中有单字节长的字符,也有多字节长的字符。Windows 用到的 MBCS 只有二种字符类型,单字节字符和双字节字符。因此Windows 中用得最多的字符是双字节字符集,即 DBCS,通常用它来代替 MBCS。
- 第三种编码方式是Unicode。 Unicode 只是一个字符集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储,通常说 Unicode 字符,指的是 UTF16,既所有字符都以双字节存储,故有时也将 Unicode 称为宽字符集(Wide characters)。
2.ASCII、MBCS、ANSI、Unicode编码的关系和区别
- ASCII 编码 0~127 使用一个字节即可表示;
- 为了扩充 ASCII 编码,以用于显示本国的语言,不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种文字延伸编码方式,称为 ANSI 编码,又称为MBCS(Muilti-Bytes Charecter Set,多字节字符集),它是编码的一种类型,而不是某个特定编码的名称。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码,所以在中文 Windows 系统下要转码成 GB2312,只需要把文本保存为 ANSI 编码即可。 不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。一个很大的缺点是,同一个编码值,在不同的编码体系里代表着不同的字。这样就容易造成混乱。导致了 Unicode 码的诞生。
-
GBK 字符集是 GB2312 的扩展,它是一种双字节编码,可以表示21003个汉字和符号。
- 为防止编码冲突,将所有语言都统一成Unicode编码,该编码内存存储方式有UTF-8,UTF-16和 UTF-32,我们习惯说的 Unicode 实际是说的 UTF-16 这种内存存储方式,这个很多博客都没有说清楚,很多初学者很容易混淆编码和内存表示方式;
3.Unicode 和 MBCS 字符串之间的转换
- Windows 编程中常常看到函数 WideCharToMultiByte,其第一个参数 CodePage 为CP_ACP时, 指的 UTF-16 表示的 Unicode 字符串 (WCHAR) 转化为 MBCS(CHAR), CodePage 为CP_UTF8 时, 指的 UTF-16 表示的Unicode 字符串 (WCHAR) 转化为 UTF-8 表示的Unicode 字符串(CHAR),