zfjyq 2005-5-9 02:43
[原创]mambo 4.5.2后台及RSS乱码完美简单解决方案&抓虫手记
一直以来都在研究mambo系统的设计,不过我用的是英文版,主要是看看它的系统体系,英文版的要精简一些的阿。今日准备用manbo将公司网站改版,下载并安装了mambo 4.5.2的黄金中文版,才发现后台居然是乱码,本着自己动手丰衣足食的理念,开始了漫长的Bug寻找之旅…………历经5个小时漫长的抓虫之旅,终大功告成。特发本人之处女贴以飨诸位曼友(本人一直在潜水,呵呵)。并将其中历程一并写出,作抛砖引玉尔。
[size=18][color=brown][b]测试环境:[/b][/color][/size]
本人喜新厌旧(非人方面),所用环境如下:
apache 2.0.53
php 5.0.3
mysql 5.0.4 Beta Nt
Window XP
Zend Studio
[b]各项配置如下:[/b]
[u]Apache:[/u]
AddDefaultCharset GB2312
[u]php5:[/u]
extension=php_mbstring.dll
[u]mysql 5[/u]
MySQL 字符集: UTF-8 Unicode (utf8)
数据库整理: latin1-general-ci
zfjyq 2005-5-9 03:20
[原创]续--安装
[color=green]论坛速度感觉很慢阿?很影响形象吗,Mambo是个好东东,但不如意的地方也不少啊。:)继续继续,呵。[/color]
[color=brown][b]安装:[/b][/color]
下载黄金版的mambo 4.5.2,正常安装。~~安装时居然也报错?是SQL建表语句错误:
[color=red][i]SQL=Invalid default value for 'rating_sum':
- - - - - - - - - -
# Table structure for table `mos_content_rating`
CREATE TABLE `mos_content_rating` (
`content_id` int(11) NOT NULL default '0',
`rating_sum` int(11) unsigned NOT NULL default '',
`rating_count` int(11) unsigned NOT NULL default '0',
`lastip` varchar(50) NOT NULL default '',
PRIMARY KEY (`content_id`)
) TYPE=MyISAM
= = = = = = = = = =[/i][/color]
这个好办,很明显的问题吗,rating_sum` int(11)是整数型,怎么能富缺省值为空字符呢?找到安装表的SQL文件:mambo_dir/installation/sql/mambo.sql,把 `rating_sum` int(11) unsigned NOT NULL default '',的''改为0就行了。
更改完毕,重新安装,一切正常。Right,Let's Go.
这里将已盖好的文件上传,覆盖到mambo_dir/installation/sql下就行了
zfjyq 2005-5-9 03:50
[size=18][color=brown][b]寻虫记 第一章 漫漫征途[/b][/color][/size]
安装完毕,直接进入后台,乍眼一看,一切正常。心中暗想,三年了,所有发票屡谢屡刮,莫非苍天开眼乎,按下购彩票心情不表,一路按去。
然奇迹未现,一路乱码纷现。唉,开始磨刀向臭虫也。
开始狂调apache语言设置,mysql字符集设置以及php的各种有关设置,甚至包括mbstring的函数替换选项等等各种组合,罢了,乱码依旧。
无奈,看来此Bug与系统配置无关也。命苦也命苦也,只得翻遍数万行代码中,数百文件。千怕万怕,就怕嫁错郎啊!无奈,追寻URL足迹一路寻去。先从解决Menu模块入手,administrator/index2.php --〉administrator\components\com_menus\admin.menus.php--〉…………好多@#$@$,我找,我跟…………终于找到了臭虫发源地....XML文件。
大喜,午时,饭至。开饭了,且听下回分解。
zfjyq 2005-5-9 04:18
[size=18][color=brown][b]寻虫记 第二章 我的征途是星辰大海[/b][/color][/size]
饭后,心想,本人一向以善为本,虽不曾彩票暴富,也不只独落阴沟把,于是搜本坛,Key='乱码'。果然纷纷攘攘,仁者见仁智者见智,英雄所见都差不多哩,其中多篇文章深有启发,然,最终确是需要重新编译php!这怎生得了,想我沁润php数月,也没干过这活啊,何况$%$#。
欲就此打住,却又于心不甘,上午已费两个时辰,岂能白白浪费?况且某某人曾经教导我们,万事皆有源也,通过改动源代码肯定能解决,妖还是妖他妈生得呢,还能找不到根乎。
而漫眼望去,源码似海,踌躇一阵,横下心来埋头苦看去也。
[i][color=blu](吾深知赌博之害,未料今日也没能免俗,乌呼爱哉)[/color][/i:7c1d9cc19a]
一下午时光飞逝,将XML存储文本编码从gb2312、gb18310、gbk到utf-8、unicode,又到windows-1251等十种编码方式及改变XML ENCODE数种方式循环测试,均告失败,除了其中出现几次乱码变?之外,未见成果,残念,彻底放弃简单方式,看来问题只能通过源代码入手,问题出在多字节的XML解析部分。一路根踪源码,良久………
zfjyq 2005-5-9 04:56
[size=18][color=brown][b]寻虫记 第三章 曙光初现[/b][/color][/size]
一路源码跟去,直到Mambo使用的domit XML解析库。上网查阅,发现其有更新版本,Down&Recover,心中窃喜,如此岂不省事?然而事实再一次见证了投机倒把者的失败。继续源码研究中.............
埋头于domit,同时研究其所带文档,终于发现其核心解析代码中有一功能,可以使用php开源的解析器SAXY来代替系统内置的XML解析器函数,眼前一亮,最不济干脆手工更改源代码作多字节支持,嘿嘿,精神大振,上网搜索SAXY,又发现更新版本,继续窃喜,继续D&R,继续见证事实。
跟踪源码中..........终于,于mambo_dir/includes/mamboxml.php中发现其调用代码,尝试更改参数打开SAXY支持,而后再看管理后台,顿时幸福的成就感种满全身,所有参数栏完全正常,狂喜,但一路按去,发现只有参数栏恢复正常,而新建菜单和组件安装依然如故。无妨,尾巴都揪出来了,还摸不着瓜么,占占兴奋中,放松ing.....
其时已日落西山,携夫人会餐也。。。
zfjyq 2005-5-9 05:14
[size=18][color=brown][b]寻虫记 第四章 大结局[/b][/color][/size]
至沸腾渔乡,被痛宰,两份小菜加一份炒米被要一百大洋,肉疼毕,刮票,如故。
至蜗居,继续。
改动数处,均无效,大怒,Find In All Files ,Key='xmlDoc->loadXML'搜出十几处,不尽愤怒,已经有了一个MamboXML的封装类,干嘛还有这么多地方直接调domit,真是#$%$^不言中。
想想要改十几处文件,不禁头发晕手发慌,如此苦力岂是我辈所为,一不做二不休,直接将domit文件中可选项改为必选项,将可选的'软'解析固定死,于是乎云开雾散,大放光明,所有选项均露出本色,大功告成也。:)
最终改动如下:
mambo\includes\domit\xml_domit_lite_parser.php
963行
原程序:
[color=green]function parseXML($xmlText, $useSAXY = true, $preserveCDATA = true, $fireLoadEvent = false) {[/color]
在其后添加一行
[b][color=blu]$useSAXY =true;[/color][/b]
仅此而已。
附件为改好的文件,遵文注使用
zfjyq 2005-5-9 05:27
[b][size=18][color=brown]后记[/color][/size][/b]
终于告一段落,要说的是此种改法为懒惰人所为,而非正规方法也。
正常应搜索所有的parseXML()调用将$useSAXY 的调用参数改为一全局变量,放入配置文件,这样应能顾及兼容性与性能。
本人天性四体不勤,望有心人为之。
(其实这应该是Mambo开发小组干的事情,真是!@$#%无以言表)
收工!
zfjyq 2005-5-9 05:39
赚钱好快啊,一不留神成百元户了,呵呵
nnjhg1981 2005-5-9 08:36
作个记号,回来慢慢看 呵呵
lang3 2005-5-9 08:59
非常精彩,堪称经典!
:D :D :D
特奖励波币3000,以资鼓励!
zfjyq 2005-5-9 11:24
老大真够慷慨的,就此谢过,呵呵。 :lol: :lol:
一日之内由穷光蛋变成百元户,继而变为n千元户,真是嘴都合不上了啊 :lol: :D :o
wbbwb 2005-5-9 21:44
非常感谢!
xianshi 2005-5-31 15:23
rss仍然是乱码
打补丁后rss仍然是乱码。
hoping 2005-5-31 18:33
赞!
zsq 2005-6-1 11:12
顶!顶得天昏地暗!!!
谢!谢得地久天长!!!
scd113 2005-7-15 10:36
搞定后台乱码问题感谢!
Zhous 2005-7-15 15:36
常常会遇到的事情。
不过xml的转码用frontpage一次搞定即可,我在用的自己转的utf-8版没有象楼主这样折腾却能正常使用。楼主对于曼波文件本身不转码,应用新的模组时还是可能出现乱码——只是凭经验说,不知道实质。因为曼波文件转码前后大小都不一样,如不存在非英文字符ios-8859与utf-8编码文件大小应该一样。这就是隐患。Mambo.cn整站为utf-8编码,其它任何地方都不会出现乱码(SMF标题截取因为无法正确处理3字节而出现乱码,不属于现在讨论的问题),只有AKOcomment出现过,就是因为当时我为了省事没有对AKOcomment文件本身进行转码处理。用了好长一段时间后忍无可忍转了,乱码现象从此消失。去过我网站的朋友可能注意到过这一现象。
RSS乱码是因为黄金版没处理好feedcreator.class.php的编码。简单点就把这个文件里的什么utf-8什么iso-XXXXXXX统统改定gb2312(共同四处),改完之后应该就会正常(好久没弄了,加上我也没用过mambo4.5.2黄金版,不排除意外)。
sandysong 2005-7-24 06:29
有个问题,关于xml解析乱码,怎么我在虚拟主机上使用就没有此问题呢?难道是因为环境问题?
dick_jj 2005-8-1 20:58
这都能写出文章...真牛的说
俺得加油了..不过真希望自己能看懂php的代码
自由我 2005-8-4 16:38
长只是,后台乱码到是解决了,可是上传的组件又是乱码,怎么解决呢,我下载的 discuz 热门主题模块1.2上传后就是乱码 :arrow:
xiaomo 2005-8-10 10:33
我的RSS还是显示乱码呀?如下
我的RSS还是显示乱码呀?如下
[quote]
<?xml version="1.0" encoding="ISO-8859-1" ?>
- <!-- generator="FeedCreator 1.7.2"
-->
- <rss version="2.0">
- <channel>
<title>Powered by Mambo 4.5.2</title>
<description>Mambo site syndication</description>
<link>http://localhost/mambo</link>
<lastBuildDate>Wed, 10 Aug 2005 10:30:39 +0100</lastBuildDate>
<generator>FeedCreator 1.7.2</generator>
- <image>
<url>http://localhost/mambo/images/M_images/mambo_rss.png</url>
<title>Powered by Mambo 4.5.2</title>
<link>http://localhost/mambo</link>
<description>Mambo site syndication</description>
</image>
- <item>
<title>什么是Mambo智能健д鞠低
autumnice 2005-8-12 13:21
后台乱码问题总算解决了,多谢高人!
netz 2005-8-16 07:39
我的mambo4.523 or 4.52 安装好后,虽然能建站,但是前台的CSS不起作用,图片显示不出来,没有布局。后台能够登录,但凡是用到javascript的按钮全都报错,图片不显示,顶上的菜单条也没出来。这是怎么回事?请指教。
--------------
配置:
OS:Window Xp sp2
Svr: apache_2.0.54-win32-x86-no_ssl
PHP: php-5.0.4-Win32
Mab: mambo452-Golden-cn
--------------
Zhous 2005-8-16 11:13
Re: 我的RSS还是显示乱码呀?如下
[quote]原帖由 [i]xiaomo[/i] 发表
我的RSS还是显示乱码呀?如下
[quote]
<?xml version="1.0" encoding="ISO-8859-1" ?>
- <!-- generator="FeedCreator 1.7.2"
-->
- <rss version="2.0">
</channel>
</rss>[/quote][/quote]
不说了吗,要把ISO-8859-1改为gb2312。
ykscan 2005-9-19 21:16
就不能一下入主题,看得我都眼晕了。
jklin 2005-9-26 21:27
这个问题确实是只出现在PHP 5.X.X系列上。原因是PHP5.X.X版本的XML模块跟以前版本完全不同了。你可以用phpinfo()显示下底层使用的XML解析模块PHP4.X.X版本使用的是EXPAT。而PHP5.X.X使用的是LIBXML2。相应的改进可以查看PHP5.X.X的Chanlog相关资料。简单来说4跟5对XML的内部编码的不同导致了MAMBO后台在PHP5.X.X下面的乱码。简单来说PHP4.X.X处理XML文件时,什么编码进什么编码出。
譬如GB2312编码的XML文件经过PHP4.X.X处理后,输出的也是GB2312编码,甚至你可以不用在XML文件使用<?xml version="1.0" encoding="gb2312"?>指定文件编码。而PHP5.X.X系列就不同了。PHP5.X.X根据<?xml version="1.0" encoding="gb2312"?>指定的编码来处理文件。如果XML内容走出指定编码的范围,那么就会出错。然后PHP5.X.X的XML解析器把指定的编码转换成解析器内部的编码格式UTF-8,然后处理XML文件。最后再以UTF-8编码输出最后结果。
经过上面的分析,相信对乱码的原因就非常清楚,PHP4.X.X进去的是GB2312的编码,出来的也是GB2312。PHP5.X.X系列的进去的是GB2312编码,出来的是UTF-8编码,最后却用GB2312编码显示。自然就是乱码了。
MYSQL 从4.0.X移植到4.1.X也会出现相似的问题。如果单纯代码兼容性上考虑一楼的朋友的解析方法不错。不过,从性能以及以后的扩展性来说,就不如我现在的解决方法了。我认为最好也是最彻底的解决方法是把所有页面的编码全部转换为UTF-8。这样即解决了乱码问题,又保持程序的性能。再结合MYSQL 4.1.X系列的多字符集的支持。就可以做出非常好的UTF-8版本的Mambo。
superpeter 2005-9-30 12:42
如何转换为UTF-8
To:jklin
请问如果将所有页面的编码全部转换为UTF-8,本人这方面知识比较欠缺,请详细地一步一步讲,谢谢!
jklin 2005-9-30 15:57
Re: 如何转换为UTF-8
[quote]原帖由 [i]superpeter[/i] 发表
To:jklin
请问如果将所有页面的编码全部转换为UTF-8,本人这方面知识比较欠缺,请详细地一步一步讲,谢谢![/quote]
1.先去下载个mambo 4.5.2.3黄金版
2.解压缩后,把目录下所有的扩展名为.html,.php,.xml,.sql的文件编码格式转换为utf-8.这步我写了个php cli脚本调用iconv来做.Windows下的话,你可以用找些批量改编码的软件,我没试过.
3.再修改目录下的所有xml扩展名文件的编码为utf-8,同样的这个你可以写个php cli来调用sed awk来做.我这里简单点,直接用ultraedit的批量文件替换来做.还有一点,就是installation目录下的php扩展名的文件的编码也要替换一下,写个sed,awk脚本是全自动的.不然的话就用ultraedit,或editplus查找gb2312的编码,一律改成utf-8的.再把language目录下的simplified_chinese.php文件里的/** templates/*.php */
DEFINE('_ISO','charset=gb2312');改为/** templates/*.php */
DEFINE('_ISO','charset=utf-8');
文件编码改完了,下面要对数据库动手脚了:
4.首先创建mambo数据库时,要选择utf-8编码.如果你使用phpmyadmin创建数据库时,只要选择utf-8下面的集合就可以了.
5.修改includes/database.php在73行前面加入设置相关数据库编码语句:
[code]function database( $host='localhost', $user, $pass, $db, $table_prefix ) {
// perform a number of fatality checks, then die gracefully
if (!function_exists( 'mysql_connect' )) {
//or die( 'FATAL ERROR: MySQL support not available. Please check your configuration.' );
$mosSystemError = 1;
$basePath = dirname( __FILE__ );
include $basePath . '/../configuration.php';
include $basePath . '/../offline.php';
exit();
}
if (!($this->_resource = @mysql_connect( $host, $user, $pass ))) {
//or die( 'FATAL ERROR: Connection to database server failed.' );
$mosSystemError = 2;
$basePath = dirname( __FILE__ );
include $basePath . '/../configuration.php';
include $basePath . '/../offline.php';
exit();
}
if (!mysql_select_db($db)) {
//or die( "FATAL ERROR: Database not found. Operation failed with error: ".mysql_error());
$mosSystemError = 3;
$basePath = dirname( __FILE__ );
include $basePath . '/../configuration.php';
include $basePath . '/../offline.php';
exit();
}
[b]mysql_query("SET NAMES 'utf8'");[/b]
$this->_table_prefix = $table_prefix;
$this->_ticker = 0;
$this->_log = array();
}[/code]
如果你的mysql是4.1.x以前版本的,我没试过.你可以参考mysql文档来做.这样基本上就把mambo转换为utf-8编码了.还有一点就是PHP5.0.X版本相对于4.x.x版本改变挺大,mambo有些代码可能不兼容,这时你可以看看php的出错提示,直接修改.
superpeter 2005-9-30 19:01
谢
To:Jklin
万分感谢
teddymicro 2005-10-1 05:05
谢谢楼主了
superpeter 2005-10-1 08:58
to:zfjyp
兄台,我在httpd.conf中怎么也找不到
AddDefaultCharset GB2312
只有
addcharset GB2312
怎么回事?
lang3 2005-10-1 10:36
找 AddDefaultCharset ,然后设置为 AddDefaultCharset GB2312
superpeter 2005-10-1 11:18
补充
就是找不到:AddDefaultCharset这个项,是不是新版的apache没有这个项了。
superpeter 2005-10-1 11:29
反馈
TO;jklin
我根据你提供的方法的5个步骤做完,在进行mambo安装时,输入localhost/(我的mambo所有文件直接安装在根目录下),没有出现安装界面,也现了一个警告:
Warning: Cannot modify header information - headers already sent by (output started at H:\knowledge_admin\index.php:1) in H:\knowledge_admin\index.php on line 15
不知道是什么原因。
jklin 2005-10-1 23:41
Re: 反馈
[quote]原帖由 [i]superpeter[/i] 发表
TO;jklin
我根据你提供的方法的5个步骤做完,在进行mambo安装时,输入localhost/(我的mambo所有文件直接安装在根目录下),没有出现安装界面,也现了一个警告:
Warning: Cannot modify header information - headers already sent by (output started at H:\knowledge_admin\index.php:1) in H:\knowledge_admin\index.php on line 15
不知道是什么原因。[/quote]
看样子是你的index.php文件在执行header( 'Location: installation/index.php' );语句之前输出了内容。检查下这个文件的“<?php”之前是否有空格之类的。
superpeter 2005-10-2 16:57
Re: 反馈
[quote]原帖由 [i]jklin[/i] 发表
[quote]原帖由 [i]superpeter[/i] 发表
TO;jklin
我根据你提供的方法的5个步骤做完,在进行mambo安装时,输入localhost/(我的mambo所有文件直接安装在根目录下),没有出现安装界面,也现了一个警告:
Warning: Cannot modify header information - headers already sent by (output started at H:\knowledge_admin\index.php:1) in H:\knowledge_admin\index.php on line 15
不知道是什么原因。[/quote]
看样子是你的index.php文件在执行header( 'Location: installation/index.php' );语句之前输出了内容。检查下这个文件的“<?php”之前是否有空格之类的。[/quote]
我检查了,没发现有空格之类的东西。我发现有许多人讨论乱码问题,可是没有哪几个是相同的,公说公有理,婆说婆有理,试了一个旧问题没解决,又出新难题,我都不敢搞了。
jklin 2005-10-2 20:54
Re: 反馈
[quote]原帖由 [i]superpeter[/i] 发表
[quote]原帖由 [i]jklin[/i] 发表
[quote]原帖由 [i]superpeter[/i] 发表
TO;jklin
我根据你提供的方法的5个步骤做完,在进行mambo安装时,输入localhost/(我的mambo所有文件直接安装在根目录下),没有出现安装界面,也现了一个警告:
Warning: Cannot modify header information - headers already sent by (output started at H:\knowledge_admin\index.php:1) in H:\knowledge_admin\index.php on line 15
不知道是什么原因。[/quote]
看样子是你的index.php文件在执行header( 'Location: installation/index.php' );语句之前输出了内容。检查下这个文件的“<?php”之前是否有空格之类的。[/quote]
我检查了,没发现有空格之类的东西。我发现有许多人讨论乱码问题,可是没有哪几个是相同的,公说公有理,婆说婆有理,试了一个旧问题没解决,又出新难题,我都不敢搞了。[/quote]
那你可以换PHP 4.4.0和MySQL 4.0.X试试。使用原来的gb2312版
spirit 2005-10-12 19:26
superpeter 写到:
TO;jklin
我根据你提供的方法的5个步骤做完,在进行mambo安装时,输入localhost/(我的mambo所有文件直接安装在根目录下),没有出现安装界面,也现了一个警告:
Warning: Cannot modify header information - headers already sent by (output started at H:\knowledge_admin\index.php:1) in H:\knowledge_admin\index.php on line 15
不知道是什么原因
那是因为你转换的utf-8时转成了带签名的.
我想问一下jklin
你讲到把gb2312这样的字串换成UTF-8
而如果是iso-8859-1,也要换吗?这种的就不必换了吧.
zijie 2005-10-13 01:04
关于字符编码,我还是从mambo.cn转一篇文章,希望zhous不要介意
来源:Donews
Unicode:
unicode.org制定的编码机制, 要将全世界常用文字都函括进去.
在1.0中是16位编码, 由U+0000到U+FFFF. 每个2byte码对应一个字符; 在2.0开始抛弃了16位限制, 原来的16位作为基本位平面, 另外增加了16个位平面, 相当于20位编码, 编码范围0到0x10FFFF.
UCS:
ISO制定的ISO10646标准所定义的 Universal Character Set, 采用4byte编码.
Unicode与UCS的关系:
ISO 与unicode.org是两个不同的组织, 因此最初制定了不同的标准; 但自从unicode2.0开始, unicode采用了与ISO 10646-1相同的字库和字码, ISO也承诺ISO10646将不会给超出0x10FFFF的UCS-4编码赋值, 使得两者保持一致.
UCS的编码方式:
UCS-2, 与unicode的2byte编码基本一样.
UCS-4, 4byte编码, 目前是在UCS-2前加上2个全零的byte.
UTF: Unicode/UCS Transformation Format
UTF-8, 8bit编码, ASCII不作变换, 其他字符做变长编码, 每个字符1-3 byte. 通常作为外码. 有以下优点:
* 与CPU字节顺序无关, 可以在不同平台之间交流
* 容错能力高, 任何一个字节损坏后, 最多只会导致一个编码码位损失, 不会链锁错误(如GB码错一个字节就会整行乱码)
UTF-16, 16bit编码, 是变长码, 大致相当于20位编码, 值在0到0x10FFFF之间, 基本上就是unicode编码的实现. 它是变长码, 与CPU字序有关, 但因为最省空间, 常作为网络传输的外码.
UTF-16是unicode的preferred encoding.
UTF-32, 仅使用了unicode范围(0到0x10FFFF)的32位编码, 相当于UCS-4的子集.
UTF与unicode的关系:
Unicode是一个字符集, 可以看作为内码.
而UTF 是一种编码方式, 它的出现是因为unicode不适宜在某些场合直接传输和处理. UTF-16直接就是unicode编码, 没有变换, 但它包含了0x00在编码内, 头256字节码的第一个byte都是0x00, 在操作系统(C语言)中有特殊意义, 会引起问题. 采用UTF-8编码对unicode的直接编码作些变换可以避免这问题, 并带来一些优点.
中国国标编码:
GB 13000: 完全等同于ISO 10646-1/Unicode 2.1, 今后也将随ISO 10646/Unicode的标准更改而同步更改.
GBK: 对GB2312的扩充, 以容纳GB2312字符集范围以外的Unicode 2.1的统一汉字部分, 并且增加了部分unicode中没有的字符.
GB 18030-2000: 基于GB 13000, 作为Unicode 3.0的GBK扩展版本, 覆盖了所有unicode编码, 地位等同于UTF-8, UTF-16, 是一种unicode编码形式. 变长编码, 用单字节/双字节/4字节对字符编码. GB18030向下兼容GB2312/GBK.
GB 18030是中国所有非手持/嵌入式计算机系统的强制实施标准.