discuz编码转换UTF8与GBK互转完美适合Discuz3.x系列
“ Discuz系列对于设置项中数据类型(比如版块设置)采用序列化方式(serialize)保存,读取时使用unserialize()反序列化字符串为数组
序列化这种方式有个致命的缺点:字符集会影响序列化结果
对于这个数组序列化
$s = [1, '站长网'];
echo serialize($s);
复制代码
UTF-8环境下结果为
a:3:{i:0;i:1;i:1;s:15:"站长网";i:2;s:24;}
GB2312环境下结果为
a:3:{i:0;i:1;i:1;s:10:"站长网";i:2;s:24;}
注意看 “站长网”前面的数字,UTF-8下面为15,GB下面为10. 这是因为在UTF-8字符集中中文字长3-4个字节,而在GB/GBK中中日韩问字长都固定为2个字节。至于英文在两种字符集中都占1字节所以序列化长度是固定的
如此不同的序列化结果产生的兼容性在于不同字符集的discuz版本的数据库中保存的设置项目值是不相同的——在进行字符集版本转移时无法直接导出数据库为目的版本字符集然后再导入。必须对数组类型的设置项进行单独反序列化再使用iconv函数进行字符集转换然后才能序列化入库。遇上数组中还嵌套有数组就更加麻烦了。而如果数组中保存有已经序列化后字符串,那么此数组序列化后就……想着就头大…… ”
提示是这样的,通过使用PHP的一个函数“addslashes”该函数可用于为存储在数据库中的字符串以及数据库查询语句准备合适的字符串。这样的话我们就可以把存储在数据库中的序列化数据读出再经过该函数转换成适合编码的字符串,然后把这个字符串再入库。
在网上我也找到了写好的PHP脚本,这个脚本是用来转换uchome的,不过没关系,虽然我的php学的不是太好,但多花点时间还是能做好的。
通过对数据库字段的逐个查看,找到了存放序列化数据的很多个字段。下面是脚本内容分享给大家,希望对你有用:
/**
* 序列化整理脚本,适合uchome2.0、discuz! X2.0、discuz! X3.1,数据库转码后在脚本运行之前请不要运行网站程序(因为网站程序会改写序列化数据),建议此脚本在数据库转换完成后立即执行。
* 此脚本放置与网站根目录,如果放置其他目录请注意修改脚本中config配置文件路径。
**/
$msg = "<a href='serialize.php?step=convert&type=x2'>Discuz! X2 序列化整理</a>";
$msg .= "<br/><a href='serialize.php?step=convert&type=x31'>Discuz! X3.1 序列化整理</a>";
$msg .= "<br/><a href='serialize.php?step=convert&type=uch2'>UCHOME 2.0 序列化整理</a>";
show_msg($msg);
} elseif($step == 'convert') {
$type = $_GET['type'];
if($type == 'x2' || $type == 'x31') {
require './config/config_global.php'; // config配置文件路径请确保能连接到目标数据库
$dbserver = $_config['db']['1']['dbhost'];
$dbusername = $_config['db']['1']['dbuser'];
$dbpassword = $_config['db']['1']['dbpw'];
$database = $_config['db']['1']['dbname'];
$dbcharset = $_config['db']['1']['dbcharset'];
} elseif ($type == 'uch2') {
require '.config.php';
$dbserver = $_SC['dbhost'];
$dbusername = $_SC['dbuser'];
$dbpassword = $_SC['dbpw'];
$database = $_SC['dbname'];
$dbcharset = $_SC['dbcharset'];
}
if($dbcharset == 'gbk')
$tocharset = 'utf8';
else
$tocharset = 'gbk';
$limit = 100;
$nextid = 0;
$start = !empty($_GET['start']) ? $_GET['start'] : 0;
$tid = !empty($_GET['tid']) ? $_GET['tid'] : 0;
$arr = getlistarray($type);
$field = $arr[intval($tid)];
$stable = $field[0];
$sfield = $field[1];
$sid = $field[2];
$special = $field[3];
$mysql_conn = @mysql_connect("$dbserver", "$dbusername", "$dbpassword") or die("Mysql connect is error.");
mysql_select_db($database, $mysql_conn);
mysql_query('set names '.$dbcharset);
if($special) {
$sql = "SELECT $sfield, $sid FROM $stable WHERE $sid > $start ORDER BY $sid ASC LIMIT $limit";
} else {
$sql = "SELECT $sfield, $sid FROM $stable";
}
$query = mysql_query($sql);
while($values = mysql_fetch_array($query)) {
if($special)
$nextid = $values[$sid];
else
$nextid = 0;
$data = $values[$sfield];
$id = $values[$sid];
$data = preg_replace_callback('/s:([0-9]+?):"([\s\S]*?)";/','_serialize',$data);
$data = addslashes($data);
mysql_query("UPDATE `$stable` SET `$sfield` = '$data' WHERE `$sid` = '$id'", $mysql_conn);
}
if($nextid)
{
show_msg($stable." $sid > $nextid", "serialize.php?step=convert&type=$type&tid=$tid&start=$nextid");
}
else
{
$tid++;
if($tid < count($arr))
show_msg($stable." $sid > $nextid", "serialize.php?step=convert&type=$type&tid=$tid&start=0");
else
show_msg('转换结束', "serialize.php?step=end");
}
mysql_close($mysql_conn);
} elseif( $step == 'end') {
show_msg('整理结束');
}
$l = strlen($str[2]);
return 's:'.$l.':"'.$str[2].'";';
}
if(!empty($url_forward)) {
$message = "<a href=\"$url_forward\">$message (跳转中...)</a><script>setTimeout(\"window.location.href ='$url_forward';\", $time);</script>";
}
print<<<END
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>序列化整理工具</title>
<body>
<table>
<tr><td>$message</td></tr>
</table>
</body>
</html>
END;
}
//以下为需要整理的数据库字段。discuz! x3.1数据库中包含ucenter数据整理,如果你使用的是独立ucenter请在ucenter里(根据自身情况修改表名)再运行一次。
function getlistarray($type) {
if($type == 'uch2') {
$list = array(
array('uchome_data', 'datavalue', 'var', FALSE),
array('uchome_blogfield', 'tag', 'blogid', TRUE),
array('uchome_feed', 'body_template', 'feedid', TRUE),
array('uchome_feed', 'body_data', 'feedid', TRUE),
array('uchome_report', 'uids', 'rid', TRUE),
array('uchome_share', 'body_data', 'sid', TRUE),
array('uchome_userblock', 'blockinfo', 'bid', TRUE),
);
} elseif($type == 'x2') {
$list = array(
array('pre_common_setting','svalue', 'skey', FALSE),
array('pre_forum_grouplevel','creditspolicy','levelid', TRUE),
array('pre_forum_grouplevel','postpolicy','levelid', TRUE),
array('pre_forum_grouplevel','specialswitch','levelid', TRUE),
array('pre_common_advertisement','parameters','advid', TRUE),
array('pre_common_plugin','modules','pluginid', TRUE),
array('pre_common_block','param','bid', TRUE),
array('pre_common_block_item','fields','itemid', TRUE),
array('pre_common_block_style','template','styleid', TRUE),
array('pre_common_diy_data','diycontent','targettplname', TRUE),
array('pre_common_member_field_forum','groups','uid', TRUE),
array('pre_common_member_stat_search','condition','optionid', TRUE),
array('pre_common_syscache','data','cname', TRUE),
);
} elseif($type == 'x31') {
$list = array(
array('pre_common_setting','svalue', 'skey', FALSE),
array('pre_forum_grouplevel','creditspolicy','levelid', TRUE),
array('pre_forum_grouplevel','postpolicy','levelid', TRUE),
array('pre_forum_grouplevel','specialswitch','levelid', TRUE),
array('pre_common_advertisement','parameters','advid', TRUE),
array('pre_common_plugin','modules','pluginid', TRUE),
array('pre_common_block','param','bid', TRUE),
array('pre_common_block','blockstyle','bid', TRUE),
array('pre_common_block_item','fields','itemid', TRUE),
array('pre_common_block_style','template','styleid', TRUE),
array('pre_common_diy_data','diycontent','targettplname', TRUE),
array('pre_common_member_field_forum','groups','uid', TRUE),
array('pre_common_member_field_home','blockposition','uid', TRUE),
array('pre_common_member_field_home','privacy','uid', TRUE),
array('pre_common_member_field_home','acceptemail','uid', TRUE),
array('pre_common_member_field_home','magicgift','uid', TRUE),
array('pre_common_member_verify_info','field','vid', TRUE),
array('pre_common_patch','rule','serial', TRUE),
array('pre_common_member_stat_search','condition','optionid', TRUE),
array('pre_common_plugin','modules','pluginid', TRUE),
array('pre_common_member_newprompt','data','uid', TRUE),
array('pre_forum_activity','ufield','tid', TRUE),
array('pre_forum_forumfield','creditspolicy ','fid', TRUE),
array('pre_forum_activity','formulaperm','fid', TRUE),
array('pre_forum_activity','moderators','fid', TRUE),
array('pre_forum_activity','modrecommend','fid', TRUE),
array('pre_forum_activity','extra','fid', TRUE),
array('pre_forum_groupfield','data','fid', TRUE),
array('pre_forum_medal','permission','medalid', TRUE),
array('pre_forum_spacecache','value','uid', TRUE),
array('pre_home_feed','title_data','feedid', TRUE),
array('pre_home_feed','body_data','feedid', TRUE),
array('pre_home_share','body_data','sid', TRUE),
array('pre_ucenter_applications','extra','appid', TRUE),
array('pre_ucenter_pm_list','lastmessage','plid', TRUE),
);
}
return $list;
}
?>
保存红色代码线中间的代码另存为serialize.php然后上传到网站根目录选择自己的网站版本进行整合,到此问题解决。
discuz编码转换UTF8与GBK互转完美适合Discuz3.x系列的更多相关文章
- 理解perl的编码转换——utf8以及乱码
工作需要,闲暇之余,仔细研究了一下脚本乱码的问题 1. vim新建的文件 1)在linux命令行 vim命令建立的文件,如果内容中不出现中文,默认是ASCII.那么用notepad++打开的时候,就是 ...
- Linux字符编码转换 UTF8转GB3212
在LINUX上进行编码转换时,既可以利用iconv函数族编程实现,也可以利用iconv命令来实现,只不过后者是针对文件的,即将指定文件从一种编码转换为另一种编码. 一.利用iconv函数族进行编 ...
- 黄聪:C#中WebClient自动判断编码是UTF-8还是GBK,并且有超时判断功能
public class WebDownload : WebClient { private int _timeout; /// <summary> /// 超时时间(毫秒) /// &l ...
- 一文读懂所有的编码方式(UTF-8、GBK、Unicode、宽字节...)
编码方式就分两类:ANSI编码.Unicode编码.这两类编码都兼容ASC码. ------------------------------------------------------------ ...
- C# 编码转换 UTF8转GB2312 GB2312转UTF8
/// <summary> /// GB2312转换成UTF8 /// </summary> /// <param name="text">&l ...
- 使用MultiByteToWideChar转换UTF8为GBK(UTF8在Windows的代码页是CP_UTF8)
两个使用的函数: 1,UTF8转化为Unicode,inline为了编译后更快运行,老用到了,返回字符串为了使用链式表达式 inline WCHAR *UTF8ToUnicode(const cha ...
- 字符编码之间的转换 utf-8 , gbk等,(解决中文字符串乱码)
目录 1.背景. 2.编码的理解 3.编码之间的相互转化 4. str类型说明 5. 可以使用的编码类型 6.参考文章 1.背景 Python中与其他程序进行交互时,如果存在字符串交互,特别是字符串中 ...
- 关于utf8 unicode gbk 编码乱码汇总
首先从一个问题说起: 插入一个中文到blob类型(mysql编码是utf-unicode-ci). insert into blobtype(data) values('中文你好') 复制数据显示为 ...
- 关于JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换
我们最初学习计算机的时候,都学过ASCII编码. 但是为了表示各种各样的语言,在计算机技术的发展过程中,逐渐出现了很多不同标准的编码格式, 重要的有Unicode.UTF.ISO-8859-1和中国人 ...
随机推荐
- 【转】牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结
基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会 ...
- unity下载文件二(http同步下载)
说到下载,其实C#里的网络模块,真的是被各种封装,最终就看你对这个语言中库的熟悉程度了. 抛开C#中IO效率的弊病不说,真的很容易,记住,太过于注重效率或者追求极致,你将会死的很惨,有时候折中才是最好 ...
- 在阿里云主机的Debian操作系统上安装Docker
因为需要新搭建饭团网站,所以需要在阿里云的主机上跑数据库,java环境. 考虑到可扩展性和模块化,所以准备最近流行的docker技术.Docker -- 从入门到实践 阿里云主机1核1G,资源不多,所 ...
- 敏捷软件开发:原则、模式与实践——第8章 SRP:单一职责原则
第8章 SRP:单一职责原则 一个类应该只有一个发生变化的原因. 8.1 定义职责 在SRP中我们把职责定义为变化的原因.如果你想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责.同时,我 ...
- 【转】Python开发指南:最佳实践精选
总体原则 价值 “为别人开发你也想要使用的工具.” ——Kenneth Reitz "简洁总是胜过可用." ——Pieter Hintjens "满足90%的使用场景.忽 ...
- nim2 取石头youxi
a先把石头分堆,然后bababa的顺序取石头,只能取其中一堆中的若干颗(不能不取) 这种问题先考虑 先取者的胜态问题 (1,1)先取者必败, 所以(1,x),当x>1时可以转换为(1,1)使后取 ...
- Java 读取大文件方法
需求:实际开发中读取文本文件的需求还是很多,如读取两个系统之间FTP发送文件,读取后保存到数据库中或日志文件的数据库中保存等. 为了测试首先利用数据库SQL生成大数据文件. 规则是 编号|姓名|手机号 ...
- SSL协议详解
背景介绍 最近在看<密码学与网络安全>相关的书籍,这篇文章主要详细介绍一下著名的网络安全协议SSL. 在开始SSl介绍之前,先给大家介绍几个密码学的概念和相关的知识. 1.密 ...
- 读书摘要:第七章 闩Suan锁和自旋锁
摘要: 1.闩锁就像是内存上的锁,随着越来越多的线程参与进来,他们争相访问同一块内存,导致堵塞.2.自旋锁就是闩锁,不同之处是如果访问的内存不可用,它将继续检查轮询一段时间.3.拴锁和自旋锁是我们无法 ...
- nginx入门(安装,启动,关闭,信号量控制)
公司使用到了nginx,于是周末初步接触了一下nginx,立即被其简洁,优雅,高效的特性给迷住了.nginx是在是个好东西,配置极其简单,容易理解,极其高效,稍微一调优,ab测试10k并发,很轻松.比 ...