老系统导出的 CSV,用 Excel 打开一列中文全是乱码,用记事本另存为时把编码切成 ANSI 再打开才正常——这种文件十有八九是 GBK 编码。想弄明白它到底怎么排的,就得看 gbk 编码表。

GBK 在编码体系里的位置

GBK 是 1995 年发布的汉字内码扩展规范,向下兼容 GB2312,把 6763 个常用汉字之外的字也收了进来,总共两万多个汉字和符号。再往上一层是 GB18030,同样兼容 GBK。在简体中文 Windows 里,GBK 对应代码页 936,所以老软件设置里写的 CP936 指的就是它。

编码表的区间结构

编码表按字节分区看:0x00 到 0x7F 这一段直接沿用 ASCII,英文字母、数字、半角标点都在这里。汉字从双字节区开始,首字节取 0x81 到 0xFE,次字节取 0x40 到 0xFE(跳过 0x7F),两个字节组合定位一个字符。GB2312 的一级汉字按拼音、二级汉字按部首排在前面区段,GBK 扩充的生僻字和符号排在后面的扩展区。查表时先看首字节落在哪个区,再顺着列找次字节。

查表和验证的小办法

手工查一个字的 GBK 码,网上搜 gbk 编码表能找到按行列排的表格,横竖交叉一格就是一个字符。用代码验证更快,Python 里把字符用 encode('gbk') 编一下,输出的两个十六进制字节和表上的行列号一对就确认了。注意全角半角是两个不同字符,编码不一样,抄表时别混。

从乱码反推编码

排查乱码是编码表最实际的用法。UTF-8 的中文文件被按 GBK 解码,常出现锟斤拷这类固定组合;反过来 GBK 文件被按 UTF-8 解码,多半变成一串问号或带问号的方块。看到哪种乱法,基本能反推出文件的真实编码和读取时用的编码各是什么。程序里同理,读写文件、连接数据库的地方显式指定编码,别依赖系统默认值,导入导出前先对齐编码,能省掉一大半扯皮。

给个实在建议:新项目、新接口一律用 UTF-8,别再生产新的 GBK 数据;只有对接老系统、老数据文件时才按 GBK 处理,并把一份编码表存在手边备查。