Archive for December 6th, 2006

最佳实践 - 从GB2312编码的WordPress博客系统升级到UTF-8编码

Wednesday, December 6th, 2006

本人博客网站在今年7月从blogchina移植到了租赁虚拟主机上的WordPress(WP)系统。在文章搬家的过程中,由于blogchina采用了GB2312编码,当时为了省事儿,直接写了程序自动导到WP上并把WP的缺省编码从UTF-8改成GB2312以正常显示中文字符,现在看来这个决定并不聪明。原因有3:

  • 由于GB2312页面无法混合显示多语言文字,在世界都开始变平的情况下,未能与世界接轨;
  • 在非中文环境的操作系统中,如英文版Windows/Linux下,显示页面为乱码,而这些系统通常对Unicode字符都可以正常显示(需要相应字体);

于是下决心把目前采用GB2312的”遗留系统“升级到UTF-8,并保持原有帖子正常读取、显示。 中间尝试过的方法、走过的弯路不必细说,今天该升级工作顺利完整,全部用户数据转成UTF-8,前台的PHP显示也完美支持。具体方法如下:

1. 备份全部博客文章

备份是所有系统升级前的必经之路,WordPress的备份功能好在不仅可以备份数据,它能连通DDL一起都保存在一个文件中,直接运行该文件中的SQL语句就能重新建表并导入数据。备份前必须前激活WP的备份插件,见图1:


图1 激活WP备份插件

2. 文章备份
我3年多的帖子纯文字部分总共才1M多一点,用HTTP方式直接下载就可以了,下载后得到一个.gz的压缩包文件,内有.sql文件一个,见图2、3:

图2 保存备份文章

图3 压缩的文章备份

3. 解压缩.sql文件并转码

用支持编码转换的文本编辑器打开(我用的是UltraEdit),把该文件转换成UTF-8编码。在Ultraedit中的做法是选择File- >Conversions->ASCII to UTF-8 (Unicode Editing),另存为。中文字符从GB2312转到UTF-8,存储由2个字节变成3个,所以文件将有所增大,见图4的比较(转换后的文件大了近 200KB):

图4 转码前、后备份文件大小比较

4. 修改备份文件建表语句中使用的缺省编码

把SQL建表的default encoding,从”latin1“改成“utf8”,注意utf和8之间没有横杠。本人系统中共11张表,11个表定义全部修改替换,如图5:

图5 修改表定义缺省编码

至此,数据准备工作完成。

5. 删除老表

登录到WP的数据库管理Web界面(http://mysql.yourname.com),点击当前blog数据库显示属性,见图6:

图6 删除全部数据表

依次删除全部11张表(点击红叉)。

6. 更改数据库编码

把当前数据库缺省的非UTF-8编码修改成”utf8_general_ci“,见图7:

图7 修改数据库编码方式

7. 执行修改后的SQL恢复数据
点击Web管理页面的”SQL” tab,从本地文本编辑器中copy整个备份文件并粘贴到SQL文本框内,点击Go执行SQL、导入数据。如果正确无误的话,会显示succesful。见图8:

图8 执行SQL重新建表恢复数据

8. 修改WP系统中的wp-db.php文件

在wp-db.php文件里,数据库建立连接的代码行后加入“mysql_query(“SET NAMES utf8”);”,这个重要环节的贡献源自此文。见图9:

图9 修改访问数据库的编码形式

9. 修改WP的缺省locale

OK,整个编码转换过程基本完成。重新登录系统(会发现表示乱码的”???”问号,不用管它),在”Options“->”Reading“选项中把原来的”GB2312″改成”UTF-8″,保存、属性,所有???问号字符变成正常的中文字符。

10. 收尾

如果对WP的header,sidebar等theme文件做过定制,进入相应管理选项手工删除其中的乱码文字,重新输入。至此,采用GB2312编码的WordPress系统顺利升级成UTF-8。