将情感进销存的编码从gb2312改变为utf8

应一个朋友的需要,用免费开源的[情感进销存](http://www.qinggan.net/thread.php?fid=43)给他开小店用,刚开始嘛,先试试看好用不。好像情感是国内仅存的免费、开源,又能用,还有人继续维护的进销存软件了,挺难得的。

情感进销存默认的编码全部都是gb2312的,从数据库到html,而我的环境自然是全utf8编码的ubuntu,如果是一次性转换的话,手工也是可以作的,但情感进销存如果出新版,还得从头改过,所以搞了个小脚本来自动转换:

#!/bin/bash

find . -name "*.txt" |xargs -I '{}' iconv_gb2u '{}'
find . -name "*.htm" |xargs -I '{}' iconv_gb2u '{}'
find . -name "*.php" |xargs -I '{}' iconv_gb2u '{}'
find . -name "*.sql" |xargs -I '{}' iconv_gb2u '{}'

#echo "Modify libs/mysql.class.php, change set names gbk to utf8."
# echo "Modify tpls/head.htm, head.emp.html, change http-equiv gbk to utf9"
replace "charset=gbk" "charset=utf8" -- install/*.php
replace "CHARSET=gbk" "charset=utf8" -- install/*.php
replace "SET NAMES 'gbk'" "SET NAMES 'utf8'" -- libs/mysql.class.php
replace "charset=gbk" "charset=utf8" -- tpls/*.htm

# For safe
chmod -x `basename $0`

其中用到的iconv_gb2u也是一个小脚本,作用是使用iconv命令把gb2312编码的文件转换为utf8,原生的iconv只能转换,不能回写同名文件,用这个脚本写到临时文件再拷回来覆盖。

再转回来说咱们的php程序的编码转换,首先要把所有的文件编码都转换了,包括txt类型的readme说明文件,htm类型的模板,php类型的程序,主要是为了看里面的注释,以及sql类型的数据库定义,里面还有初始化的数据,所以必须进行编码转换。这些转换用iconv就可以了,用[find配合xargs](311)一次性全部转换完毕。

接下来install/*.php中替换的是html页面的编码,以及执行安装sql创建数据表时指定表的默认编码;libs/mysql.class.php是连接数据库后指定客户端连接的字符集;tpls/*.htm则是替换html页面中的编码定义。这些用到了replace命令,replace可以把文件中的一个字符串替换为另外一个字符串,好像是mysql附带的实用小程序,在本例中够用了,再复杂一点的情况可以考虑使用[sed,多行、正则替换](346)都能够完成。

最后一句就简单了,如果对一个文件执行两次iconv,第一次把gb2312转成了utf8,可第二次就不知道转换成哪国编码了,所以为了避免程序被误运行两次,去掉可执行属性。

以后用起来就简单了,如果情感进销存再发布新版,先解压到一个临时文件夹,用这个脚本进行转换之后,再覆盖拷贝过来就可以了。

2 thoughts on “将情感进销存的编码从gb2312改变为utf8”

Leave a Reply

Your email address will not be published. Required fields are marked *