GBK 字符集与编码
GBK 虽然也带国标 GB, 但它没有编号, 所以实际上并不是国家标准, 只是一个事实标准, GBK 中 K 指 扩展 的意思, 因为 GB2312 编码的字符已不够用, 所以有了 GBK 这个过渡方案.
GBK 概述
GBK 是对 GB2312 的一个扩展, 兼容 GB2312, 因此也兼容 ASCII, 也是一个变长编码方案. 下面是一个简介:
GBK 总体编码范围为 8140-FEFE, 首字节在 81-FE 之间, 尾字节在 40-FE 之间, 总计 23940 个码位, 共收入 21886 个汉字和图形符号, 其中汉字(包括部首和构件)21003 个, 图形符号 883 个.
GBK 是国家有关部门与一些信息行业企业等一起合作推出的方案, 但并未作为国家标准发布, 只是一个事实上的标准, 一个过渡方案, 为 GB18030 标准作的一个准备.
首字节(lead byte)
下面是 Windows Code page: 936 (GBK), 第一字节的概况(来自 http://msdn.microsoft.com/en-US/goglobal/cc305153.aspx )

Code page 936 实质上是 GBK 到 UTF-16 编码的一个转换表, 图中字符下面标注的四位 16 进制数字即是 UTF-16 编码.
- 上面部分是兼容 ASCII 单字节编码.
 - 下面阴影部分是双字节编码中的第一个字节, 表中作为超链接, 可以点击进去查看具体内容.
 
注: 0x80(=128)被用于欧元符. (图中小圆框部分)0xFF 则保留, 实际共有 128-2=126 块.
另: 新的 GB18030 标准使用双字节编码欧元符号, 去掉了这个单字节编码.
第二字节
前面说到"啊"的机内码是 B0A1, 我们点击 B0(上图中红色小框部分)去查看一下(来自 http://msdn.microsoft.com/en-US/goglobal/gg675356 ):

"啊"位于 A1 处, 所以它是兼容 GB2312 的. 而前面的那些字符就是 GBK 扩展的了.
"啊"下面的 554A 即是它的 UTF-16 编码. GBK 与 UTF-16 之间编码的转换只能通过查表实现.
第二字节从 0x40 开始, 不是从 0x00 也不是从 0x80 开始. 表格只有 12 行.
因为不是从 0x80 开始, 这意味着第二字节最高位也可能是 0. 这点与 GB2312 不同, GB2312 确保了无论是高低字节最高位均是 1.
另外 0x7F 和 0xFF 两处保留未定义.
所以实际有 12×16-2=192-2=190 个字符. 注: 并非所有的块里面都是 190 个字符, 也有不少是少于 190 的.
粗略估算可得 126×190=23940, 所以 GBK 也就是两万多个字符这样子.
GBK 还是 UTF-8?
GBK 使用两字节保存中文, 也能兼容 ASCII, 而对常用汉字, UTF-8 都是采用三字节编码, 因此无论是全中文还是中英文混合的情况, GBK 保存的效率都要好于 UTF-8.
这也不奇怪, 毕竟是亲生的.
但它也有些不好的地方, 比如它不能支持一些国际性的文字, 在国际化, 通用性方面它肯定不如 UTF-8;就汉字而言, 由于容量空间的限制, 它也无法收录更多的汉字了.
所以, 怎么选择, 自己看着办.