再谈GB18030与UNICODE编码

2013年4月20日 | 分类: 日志 | 标签:

在cnbeta上看到这样一篇文章 [评论]GB18030 – 想说爱你不容易,看完此文再次见识到CB喷子们的智商。这样一篇没有水准的文章,我觉得有必要再写点东西留给有需要的人,虽然之前已经写过一点相关的东西了。

注:本文名词较多,需要对字符编码有一定了解才可以看明白,本文不是科普文章抱歉。在此推荐一篇比较详细的编码知识讲解文章http://www.luanxiang.org/blog/archives/1271.html。

首先要明确的是:
1.没有所谓的ANSI字符集或者ANSI编码,所谓的ANSI编码正确的叫法是windows代码页(内码表),简体中文的Windows使用936代码页,基本等同于GBK字符集。(作者开头就说“疑惑一:GB18030到底是一种ANSI编码还是Unicode编码?”真是莫名其妙的很,能提出这种问题足见其水准之低)
2.早期的Windows(NT之前)是原生的单字符操作系统,并非原生支持Unicode,东亚版本的Windows系统则使用多字节字符集,具体而言就是双字节字符集(DBCS),原理是使用一个前导字节和尾字节,DBCS是不可能同时支持所有现有的字符集(由UCS-2与UTF-8转换关系很容易看出)所以不同语言地区会使用不同的代码页,如简体中文的Windows使用的是936代码页,繁体中文的使用950代码页。
3.Windows NT则是原生支持Unicode的,使用的是UCS-2编码(UTF-16的子集,在UNICODE辅助平面字符出来前与UTF-16一样),但是为了兼容以前的MBCS程序还是加上了代码页的功能。WIN32 API所有文本参数的函数接口都包括2个版本:一个基于代码页(ANSI)的版本,一个宽版本(称为’W’)处理Unicode。前者的实现其实就是先调用MultiByteToWideChar将基于代码页编码转化为UCS-2然后再调用后者,另外还有一个WideCharToMultiByte接口将UCS-2编码转换为基于代码页的版本。
4.GB18030与UTF-8一致,采用多字节编码,是ASCII的超集。(作者居然说“这就是说微软确实是把GB18030当作一种多字节的ANSI编码来看待的。”,我已经不知道说什么好了)

知道了这些, 就容易理解Microsoft GB18030 支持工具包的原理了。正如Windows提供对GBK编码的支持一样,通过提供MultiByteToWideChar/WideCharToMultiByte接口实现对GBK与UCS-2编码的互相转换以支持,Microsoft GB18030 支持工具包提供了一个动态链接库ms4bsp.dll来实现GB18030-2000与UCS-2编码之间的互相转换。我只能说并非Windows不支持这些编码标准,而是作者根本不懂这个工具怎么用。把责任推倒有关部门的头上更是莫名其妙……

  1. ggarlic CHINA Google Chrome 28.0.1478.0 Windows 7
    2013年4月21日00:00

    顶,大概12点发

    [回复]

[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]