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

December 6th, 2006 10:24 pm

本人博客网站在今年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。

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

  1. Ding Feng says:

    两点感受:
    第一,估计这篇帖子以后会跟你以前写的CS系博士毕业指南一样成为经常被搜到和引用到的帖子之一。
    第二,博主用的上述软件和系统中,貌似Winzip和UltraEdit有D版的嫌疑,呵呵,其他都是open source或者free software了。

  2. Zhang Ling Zhang Ling says:

    都是正版的。因为这两个产品不是免费升级,所以一直用的低版本。

  3. Zhang Ling Zhang Ling says:

    其实我还真想过截屏用7-zip和VIM,不过何必要欺骗自己呢,这两个软件的确是平时频繁使用的。我很喜欢open source,但不歧视商业软件。

    世界变了,当你用commerical software的时候,大家已经开始怀疑你的integrity了,呵呵。

  4. Ding Feng says:

    呵呵,是我心理阴暗,博主integrity木有问题,呵呵

  5. 美好时光 says:

    文章写得干净利落,本人近来正在为转移数据库之事大感头痛。明白了,终究是水平问题…

  6. Pisoul says:

    博主,我现在遇到的问题比较头疼.

    正常进入后台发布,阅读是正常显示的UTF-8
    但是使用Windows Live Writer 发布`本地测试可以`但是在虚拟主机上就全部显示???了…

    编码选择已经全部utf-8`数据库也整理了.还是不行.
    请指教

  7. Zhang Ling Zhang Ling says:

    楼上的问题似乎是Webogger API的问题。一般情况下的Blog Client都是支持UTF-8的内容发布(而且基本上是只支持这一种)。你换其他的Blog client试过吗,比如Zoundry.

  8. 裴庆新 says:

    请教你一个问题,是这样的,我的WP编辑器不知道怎么总是不正常显示,别人说不是副广本格式。我也找了问题但就是解决不了。请问我该怎么办?谢谢!

  9. Zhang Ling Zhang Ling says:

    什么是副广本格式?RTE (Rich Text Editor)?

  10. double says:

    我将我的mysql数据库中数据转化成utf8时用斑竹的方法就不行,转化完了之后另存了文件还是老样子,不知道为什么,而且mysql用ems管理时要如何把已有的数据库删除,在重新导入时不会出现数据库或表已存在的提示?我的一些代码如下:
    SET FOREIGN_KEY_CHECKS=0;

    CREATE DATABASE `bugfree10`
    CHARACTER SET ‘gb2312’
    COLLATE ‘gb2312_chinese_ci’;

    USE `bugfree10`;

    #
    # Structure for the `bugfile` table :
    #

    CREATE TABLE `bugfile` (
    `FileID` int(10) unsigned NOT NULL auto_increment,
    `BugID` mediumint(7) unsigned zerofill NOT NULL default ‘0000000’,
    `FileTitle` varchar(100) NOT NULL default ”,
    `FileName` varchar(50) NOT NULL default ”,
    `FileType` varchar(10) NOT NULL default ”,
    `FileSize` varchar(20) NOT NULL default ”,
    `AddUser` varchar(30) NOT NULL default ”,
    `AddDate` datetime NOT NULL default ‘0000-00-00 00:00:00’,
    PRIMARY KEY (`FileID`),
    KEY `BugID` (`BugID`)
    ) ENGINE=MyISAM DEFAULT CHARSET=gb2312;

  11. 5800 says:

    可是现在没有gb2312版本的了

Leave a Reply

*