Discuz教程网

discuz论坛编码转换,字符集由gbk转为utf8

[复制链接]
authicon dly 发表于 2012-2-9 21:21:13 | 显示全部楼层 |阅读模式
论坛系统为了兼容法语、德语等语言的特殊字符,需要将字符集从gbk修改为utf8。下面是转换步骤:

第一步:Phpmyadmin中备份数据库,备份的选项中一定不要选择“扩展插入”这个选项,否则一个表中的数据都会用一个插入语句来执行,如果表中的数据量大的话,会影响phpmyadmin的还原,造成 2006错误.

第二步:将备份数据文件的字符集转变为utf8格式,可以用emeditor等文本编辑工具。

第三步:将数据库表的编码方式修改为utf8,具体为修改备份数据中的这个字符串:“DEFAULT CHARSET=gbk”,修改为“DEFAULT CHARSET=utf8.

第四步:下载全新的discuz论坛程序和ucenter程序,(当然是utf8版本),并分开安装。

第五步:在phpmyadmin中还原数据库,还原之前需要修改phpmyadmin的相关设置。打开config.default.php文件,修改$cfg['ExecTimeLimit'] =0,将执行时间设置为不限制,因为数据量过大时会超过默认的执行时间。
由于php对上传文件的处理有特殊设置,因此修改 $cfg['UploadDir'] = './upload';
这样,只需要将备份的文件放到这个文件夹中,由phpmyadmin自动识别,而无须上传步骤。

如果确实需要上传,可以修改php.ini文件中的相关选项。post_max_sizeupload_max_filesize 两个参数修改为合适的大小。重启php服务即可。

完成以上设置,即可执行还原。如果sql文件在百兆左右,执行时间可能会一刻钟左右的时间,耐心等待一下。具体完成时间和备份文件的大小以及硬件的配置有关。

第六步:将原来的模版文件进行编码转换。用一个小工具convertz。将GBK版本转变为utf8版本

第七步:将所有的插件文件进行编码转换。

第八步:将其他编辑的文件进行编码转换。

通过上面这八个步骤就完成了论坛编码从GBKutf8的转换。


补:将数据库的数据导出转码再倒入,某些序列化数据无法正常转换。
需要用下面这个程序进行修补:
   

  1. //文件名称:uchome序列化(serialize)数据修复程序
  2.         //程序说明:本程序针对uchome编写,其它应用请自行做响应修改
  3.         //         将已经序列化(serialize)的数据根据当前数据编码进行序列化修复;
  4.         //         解决编码转化后,对序列化数据进行反序列化(unserialize)时无返回值的问题;
  5.         //         可用于gbk,utf等编码之间的互相转化;
  6.         //         目标编码为目标数据库编码;
  7.         //程序使用:将此文件复制到uchome根目录下运行,运行前建议先将原数据备份;
  8.         //         使用前请先将数据库及本程序文件转化为目标编码
  9.         //成功案例:本程序已经完美实现uchome的gbk版本到utf-8版本的转化。简要步骤:
  10.         //         1 数据库编码转化:方案一:安装一套uchome全新的utf版本,将所有表数据清空,再将原数据库的导出数据(使用phpMyAdmin,仅导出数据,不导出表结构)导入即可;方案二:使用phpMyAdmin将原数据和表结构导出为sql文件,在导出文件中替换所有charset=gbk为charset=utf8,新建数据库,将替换后数据导入即可。
  11.         //         2 代码文件编码转化:方案一:安装全新uchome程序文件;方案二:使用covertz编码转化软件将代码转化为utf(无bom),再修改cofig.inc.php中的编码设置。
  12.         //         3 将此文件复制到uchome根目录下运行;
  13.         //         4 登陆后台,更新全站缓存,大功告成!
  14.         //示范站,http://bbs.tingclass.com ,将uc,uch,bbs全部由gbk转化为utf-8编码
  15.         
  16.         require_once './include/common.inc.php';
  17.         $arrfield = array();
  18.         //$arrfield[0] = 'variable,value,cdb_request'; //分别为主键名,需要数据转换的字段名,表名,这个变量修复数据调用表。
  19.         $arrfield[0] = 'variable,value,cdb_settings';
  20.         
  21.         /*修补UC表的变量。
  22. $arrfield[1] = 'feedid,body_data,uch_feed';
  23.         
  24.         $arrfield[2] = 'blogid,tag,uch_blogfield';
  25.         $arrfield[3] = 'blogid,related,uch_blogfield';
  26.         
  27.         $arrfield[4] = 'var,datavalue,uch_data';
  28.         
  29.         $arrfield[5] = 'sid,body_data,uch_share';
  30.         
  31.         $arrfield[6] = 'adid,adcode,uch_ad';*/
  32.         
  33.         //对原数据库中的序列化数据进行重新序列化修复
  34.         function new_serialize($m){
  35.         $len = strlen($m[2]); //转换关键操作
  36.         return 's:'.$len.':"'.$m[2].'";';
  37.         }
  38.         foreach($arrfield as $field){
  39.         $r = explode(',',$field);
  40.         $rid = $r[0];
  41.         $rfield = $r[1];
  42.         $rtable = $r[2];
  43.         $query = $db->query("SELECT $rid,$rfield FROM ".$rtable);
  44.         while ($value = $db->fetch_array($query)) {
  45.         $data = $value[$rfield];
  46.         $tid = $value[$rid];
  47.         echo $data."\n
  48.         ";
  49.         $data = preg_replace_callback('/s:([0-9]+?):"([\s\S]*?)";/','new_serialize',$data);
  50.         $data = addslashes($data);
  51.         $db->query("update `$rtable` set `$rfield`='$data' where `$rid`='$tid'");
  52.         }
  53.         echo '<hr>';
  54.         }
  55.         echo '<font color=red>转换成功!</font>';
  56.         exit;
复制代码




上一篇:dz2.5管理员有使用吗 有没有分类信息内容积分购买的功能的啊?
下一篇:【枫·传说】会员时装模块 1.0 版本(论坛积分消费的好帮手)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-5-2 07:02

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表