由于两种Blog使用的字符集不一样,所以移植的重心是unicode字符到utf8字符的转换,剩下才是数据表之间的对应。
首先用phpMyAdmin把plog的数据导出来,要知道导出来以后的sql文件中,中文都是这种乱码形式的:
INSERT INTO `plog_mylinks` (`id`, `category_id`, `url`, `name`, `description`, `blog_id`, `rss_feed`, `date`, `properties`) VALUES (1, 1, ‘http://blog.plogworld.org.tw/’, ‘pLog 中文開發日誌’, ”, 1, ‘http://blog.plogworld.org.tw/rss/rss20/1’, ‘2005-05-17 21:59:37’, ‘a:0:{}’);
配合网上找到的unicode2gb函数,可以把这些乱码转换为utf8字符,不过在转换前,有两个东西需要注意,第一个: \是\,plog不认的,需要先手工替换过来,否则转换有错误提示:
Notice: Undefined offset: 92 in E:\web\20051106\unicode.php on line 68。
而WordPress对\不感冒,所以直接在sql文件中替换就可以了。 第二个:“”—这几个字符总是会引起附近出现乱码(第三个好像还不是中文的破折号),手工替换成自己命名的符号,比如< –left quote–>,在中文转换完毕之后再替换回来就可以了。
网上有unicode2gb函数,不过不是太好找,并且需要的gb2312.txt也不好找,所以我打包放在了这里,需要的同志可以去下载。
现在最麻烦的事情来了,由于sql文件中有简体中文,也有繁体中文,所以unicode2gb函数需要略微调整一下,把:
$code=0x8080|$_global_codetable2[$code]; $gb.=chr((($code & 0xFF00)>>8) & 0xFF); $gb.=chr($code & 0xFF);改为
if (isset($_global_codetable2[$code])) { $code=0x8080|$_global_codetable2[$code]; $gb.=chr((($code & 0xFF00)>>8) & 0xFF); $gb.=chr($code & 0xFF); } else { $gb .= '&#' . strval($code) . ';'; }使用码表文件gb2312处理完毕之后,本来想着用繁体中文的码表处理一遍就可以了的,但转换出来的中文有乱码,所以经过半天的琢磨,终于发现了解决方法--先换用码表gb12345.txt转换一遍,还剩下一些没有转换的字符,然后再用big5.txt这个码表转换,在最后使用这个big5.txt码表文件的时候,还需要增加把繁体中文字符串转换为简体中文字符串的处理,所以上面的编码又要改动为:
if (isset($_global_codetable2[$code])) { $code=0x8080|$_global_codetable2[$code]; $strbig5 = ''; $strbig5.=chr((($code & 0xFF00)>>8) & 0xFF); $strbig5.=chr($code & 0xFF); $gb .= mb_convert_encoding($strbig5, 'GBK', 'BIG5') ; } else { $gb .= '&#' . strval($code) . ';'; }这样,这个sql文件终于成了全中文,基本无乱码,下面在本机建一个utf8_general_ci的mysql数据库,把sql导入进去。
然后的事情就简单了,通过本地mysql查询和对sql文件进行正则表达式替换,先后生成往wp_categories、wp_posts、wp_post2cat表中添加数据的sql,还有修改wp_posts表中post_date、post_date_gmt、post_category等字段的sql,在本地测试后,一一导入WordPress,就大功告成了!
在生成sql语句的时候还要注意,除了VALUES里面能够使用单引号’来标识字符串之外,其余标识数据库表名和字段名的引号一定要是键盘左上角的`,使用单引号mysql会提示错误。