前段日子常做编码转换,各种概念,各种纠结于其中,做个小总结,以后遇到继续补充。
从字符编码可以看出计算机系统发展历程,主要概念出现和发展始于windows平台。
ascii:一开始使用这种字符集,也够用。
gb2312,gbk,gb18030: 后续发展到中国这边,GB2312有6763个汉字,GBK有21003个汉字,GB18030-2000有27533个汉字,GB18030-2005有70244个汉字。前段日子有个bug纠结在gb18030 的扩展部分,映射错了unicode的pua区段。
big5,jis,cjk: 繁体中文编码;日文编码;中,日, 韩相同字符编码。
codepage,ansi/oem,unicode/ucs: 发展到一定程度,系统要统一处理各个字符集,出现字符集映射到内码(现在windows内码为unicode),所以就出现映射表,这张表就俗称代码页,gb2312是cp936,根据codepage找到映射表,转为内码,统一处理。
unicode/ucs,utf-8/16/32: unicode是后来各种字符集发展统一标准时出现的编码,ucs(universal char set)是unicode的另一种说法,ucs4->unicode 32位;utf系列是封装过的unicode格式;
bom/utf8: Byte Order Mark。unicode中无效编码为FFFE,一般用来判断字节传输顺序。转为utf-8编码则为EF BB BF,判断文本是否为utf-8编码的格式。
bmp/ucs4: ucs4从高到低字节分为group,plane,rows,cells;其中group = plane = 0时,称为Base Multilingual Plane(BMP)。目前未知bmp有什么用,不知道是不是应该这样理解:ucs4的bmp形式就是ucs-2 应该这样理解bmp用途。
locale/LCID: 有时候发现wps安装目录下offcie6/2052这个文件夹,2052为语言资源包。该值计算如下:
#define LANG_CHINESE 0x04 #define LANG_ENGLISH 0x09 #define LANG_FRENCH 0x0c #define LANG_GERMAN 0x07 #define SUBLANG_CHINESE_TRADITIONAL 0x01 // Chinese (Taiwan Region) #define SUBLANG_CHINESE_SIMPLIFIED 0x02 // Chinese (PR China) #define SUBLANG_ENGLISH_US 0x01 // English (USA) #define SUBLANG_ENGLISH_UK 0x02 // English (UK)
LCID由32位存储,低14位有效,存储两个值:charset,subCharset; 高10位放subCharset,低4位放Charset;
于是有 (0x02 << 10) + 0x04 = 2052;
compound_text: 处理x-windows拷贝粘贴时遇到的这种编码,当时模拟器在转换utf-8时候出现Bug。compound_text用32位表示,当时为了统一处理多种字符集出现的文本。个人理解为unicode前身。多出现在linux平台,各种客户端传输数据用。现逐步被utf-8取代。
C0 GL C1 GR。C0,C1为控制符,GL,GR为字符集编码。文档如下:http://www.sensi.org/~alec/locale/other/ctext.html。
总结编码这块的时候,看到一位前辈的一些资料,其思想很踏实,实在,很有十年前程序员的风格。有句话很实在=》不管以后是发展为什么样的职业,甚至是转行,但,现在是程序员,就踏踏实实地做好程序员该做的事。