技术的乐趣在于分享,欢迎多多交流,多多沟通。
全部博文(877)
分类: 嵌入式
2014-08-27 17:30:11
在cnbeta上看到这样一篇文章 ,看完此文再次见识到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不支持这些编码标准,而是作者根本不懂这个工具怎么用。把责任推倒有关部门的头上更是莫名其妙……