字符编码(encoding),本质上是对所要表示的字符和二进制数据之间建立一种映射关系,就和查字典一样。
对问题的描述有不同的层次,有表示层次上,有传输层次上的。
这里有一份GB2312简体中文码表。
比如汉字“君”,它在第30区,第93位。因此,“君”字用GB2312(或者说 EUC-CN)表示的话,第一个字节就是 30+0xA0 = 0xBE,第二个字节是 93+0xA0 = 0xFD,合在一起就是 0xBEFD。
GB18030,是中华人民共和国现时最新的内码字集。与GB 2312完全兼容,与GBK基本兼容,支持GB13000及Unicode的全部统一汉字,共收录汉字70244个。
由于GB 2312-80只收录了6763个汉字,有不少汉字,如部分在GB 2312-80推出以后才简化的汉字(如“啰”),部分人名用字(如中国前总理朱镕基的“镕”字),台湾及香港使用的繁体字,日语及朝鲜语汉字等,并未有收录在内。中文电脑开发商,于是利用了GB 2312-80未有使用的编码空间,收录了所有出现在Unicode 1.1及GB 13000.1-93之中的汉字,制定了GBK编码。
由于GB2312只收录了6763个汉字,有不少汉字,如部分在GB 2312-80推出以后才简化的汉字(如“啰”),部分人名用字(如中国前总理朱镕基的“镕”字),台湾及香港使用的繁体字,日语及朝鲜语汉字等,并未有收录在内。中文电脑开发商,于是利用了GB 2312未有使用的编码空间,收录了所有出现在Unicode 1.1及GB 13000之中的汉字,制定了GBK编码。
GBK最初是由微软对GB2312的扩展,也就是CP936字码表。
虽然GBK收录了所有Unicode 1.1及GB13000之中的汉字,但是编码方式与Unicode 1.1及GB13000不同。仅仅是GB2312到GB13000之间的过渡方案。
参考资料:http://zh.wikipedia.org/zh-cn/GBK
GB 13000,全称 GB 13000.1-93,包含20,902个汉字,附录是GBK。
GB12345,全称《信息交换用汉字编码字符集 辅助集》,简称 GB1,于1990年发布,可以看成是GB2312的繁体版本,共收录6866个汉字。由于不能满足现实需求,所以也不被大多数电脑系统采用。
参考资料: http://zh.wikipedia.org/zh-cn/GB_12345
Unicode 用两个或者四个字节来表示一个字符。理论上可以表示世界上所有的字符。
Unicode的基本多文种平面(Basic Multilingual Plane,简称BMP),每个字符占用2个字节(UCS-2)。理论上一共最多可以表示65536个字符。基本满足各种语言的使用。
最新(但未实际广泛使用)的Unicode版本定义了16个辅助平面,与BMP合起来至少需要占据21位的编码空间,比3字节略少,但事实上每个字符仍然占用4个字节(UCS-4)。
UCS或者UTF是用来描述如何传输这些字符。
UCS-2 是用两个字节表示一个Unicode字符,UCS-4是用4个字节表示一个Unicode字符。
因为是用多于一个字符,所以也有所谓字节序 (Big-Endian 或者 Little-Endian) 的问题。为了区分不同的字节序,可以在文字文件最前面加上一个被称为BOM(Byte Order Mark)的特殊字符 0xFEFF 作为区分。0xFEFF字符在UNICODE中代表的意义是ZERO WIDTH NO-BREAK SPACE,顾名思义,它是个没有宽度也没有断字的空白。根据 字节序 中的描述,我们可以根据 BOM 的字节序来判断整个文件的字节序。
UTF是Unicode Transformation Format的缩写。
UTF-8 使用一至四个字节为每个Unicode字符编码。其编码规则可以概括为两条:
Unicode (十六进制) | UTF-8 (二进制) |
---|---|
0000 0000-0000 007F | 0xxxxxxx |
0000 0080-0000 07FF | 110xxxxx 10xxxxxx |
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
使用UTF-8的好处是对于西方的只包含ASCII字符的文件和软件,无须或只须做少部份修改,即可继续使用。
UTF-8没有字节序的问题,因些不需要 BOM(Byte Order Mark)。
UTF-16的编码规则如下:
Unicode (16进制) | UTF-16(二进制) | 字节数量 |
---|---|---|
0000 0000---0000 FFFF | xxxxxxxx xxxxxxxx | 2 |
0001 0000---0010 FFFF | 110110yyyyyyyyyy 110111xxxxxxxxxx | 4 |
根据以上规则,UCS-2可以看作是UTF-16的子集。对于小于 0xFFFFF的字符,UCS-2和UTF-16的编码结果是一样的。也正是因此,UTF-16也有所谓字节序的问题,也是通过BOM,用和UCS-2一样的方法来处理。