去年做了一个小查询系统,使用的平台是FreeBSD+apache+php+mysql。由于数据中可能存在生僻字,所以数据库编码使用了我以前常使用的GBK编码。调用数据前首先set names gbk声明,这样显示数据正常。后来需要把数据生成为excel文件,这时问题出来了:php生成的excel文件中所有中文字符都是乱码。
上网查询,说是在head中注明编码,问题依旧,但奇怪的是生成的文件用wps打开是没有问题的,但总不能让使用单位也安装wps吧,虽然那是国产的,而且政府采购的。最后没有办法,只好生成csv文件,这样乱码问题解决了,但是下载下来的文件不能直接用excel打开,而且排版也麻烦。
清明节放假,恰好程序数据变动,于是一并想解决一下这个问题。试了几个编码,差别不大。周一回到单位突然想起既然wps能够打开,那么证明是微软是不自动检测编码而是强制使用自己的编码,而微软最常用的编码是gb2312,于是用EMS的mysql管理软件重新生成了一个数据表,编码选择那里果然发现里面也有gb2312编码选择,导入数据库后,把GBK换成gb2312,这样生成的excel文件中汉字乱码问题解决了。
晚上回家,准备把原先数据库编码改为gb2312,但一是偷懒,而是担心转换过程中数据出问题,便在没有修改字符编码的情况下,只是把set names gb2312声明,试着生成excel文件,哈哈,同样没有问题!
到网上搜索了一下:
GBK: 汉字国标扩展码,基本上采用了原来GB2312-80所有的汉字及码位,并涵盖了原Unicode中所有的汉字20902,总共收录了883个符号, 21003个汉字及提供了1894个造字码位。 Microsoft简体版中文Windows 95就是以GBK为内码,又由于GBK同时也涵盖了Unicode所有CJK汉字,所以也可以和Unicode做一一对应。
GB码,全称是GB2312-80《信息交换用汉字编码字符集 基本集》,1980年发布,是中文信息处理的国家标准,在大陆及海外使用简体中文的地区(如新加坡等)是强制使用的唯一中文编码。P-Windows3.2和苹果OS就是以GB2312为基本汉字编码, Windows 95/98则以GBK为基本汉字编码、但兼容支持GB2312。GB码共收录6763个简体汉字、682个符号,其中汉字部分:一级字3755,以拼音排序,二级字3008,以偏旁排序。该标准的制定和应用为规范、推动中文信息化进程起了很大作用。
GBK编码是中国大陆制订的、等同于UCS的新的中文编码扩展国家标准。GBK工作小组于1995年10月,同年12月完成GBK规范。该编码标准兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。
估计正是大陆制订这个关节出了问题,微软正是抓住自己的标准才会出现wps识别而excel不识别的情况。看来标准之争是不得不争啊。