发新话题
打印

[原创]mambo 4.5.2后台及RSS乱码完美简单解决方案&抓虫手记

长只是,后台乱码到是解决了,可是上传的组件又是乱码,怎么解决呢,我下载的 discuz 热门主题模块1.2上传后就是乱码 :arrow:

TOP

我的RSS还是显示乱码呀?如下

我的RSS还是显示乱码呀?如下
[quote]
<?xml version="1.0" encoding="ISO-8859-1" ?>
- <!--  generator="FeedCreator 1.7.2"
  -->
- <rss version="2.0">
- <channel>
  <title>owered 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>owered by Mambo 4.5.2</title>
  <link>http://localhost/mambo</link>
  <description>Mambo site syndication</description>
  </image>
- <item>
  <title>什么是Mambo智能健д鞠低

TOP

后台乱码问题总算解决了,多谢高人!

TOP

我的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

--------------

TOP

Re: 我的RSS还是显示乱码呀?如下

引用:
原帖由 xiaomo 发表
我的RSS还是显示乱码呀?如下
引用:
<?xml version="1.0" encoding="ISO-8859-1" ?>
- <!--  generator="FeedCreator 1.7.2"
  -->
- <rss version="2.0">
  </channel>
  </rss>
不说了吗,要把ISO-8859-1改为gb2312。
Email发MSN邮箱里吧

TOP

就不能一下入主题,看得我都眼晕了。

TOP

这个问题确实是只出现在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。

TOP

如何转换为UTF-8

To:jklin
请问如果将所有页面的编码全部转换为UTF-8,本人这方面知识比较欠缺,请详细地一步一步讲,谢谢!

TOP

Re: 如何转换为UTF-8

引用:
原帖由 superpeter 发表
To:jklin
请问如果将所有页面的编码全部转换为UTF-8,本人这方面知识比较欠缺,请详细地一步一步讲,谢谢!
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行前面加入设置相关数据库编码语句:
复制内容到剪贴板
代码:
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();
        }
如果你的mysql是4.1.x以前版本的,我没试过.你可以参考mysql文档来做.这样基本上就把mambo转换为utf-8编码了.还有一点就是PHP5.0.X版本相对于4.x.x版本改变挺大,mambo有些代码可能不兼容,这时你可以看看php的出错提示,直接修改.

TOP

To:Jklin
万分感谢

TOP

谢谢楼主了

TOP

to:zfjyp
兄台,我在httpd.conf中怎么也找不到
AddDefaultCharset GB2312
只有
addcharset GB2312
怎么回事?

TOP

找 AddDefaultCharset ,然后设置为 AddDefaultCharset GB2312

TOP

补充

就是找不到:AddDefaultCharset这个项,是不是新版的apache没有这个项了。

TOP

反馈

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
不知道是什么原因。

TOP

Re: 反馈

引用:
原帖由 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
不知道是什么原因。
看样子是你的index.php文件在执行header( 'Location: installation/index.php' );语句之前输出了内容。检查下这个文件的“<?php”之前是否有空格之类的。

TOP

Re: 反馈

引用:
原帖由 jklin 发表
引用:
原帖由 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
不知道是什么原因。
看样子是你的index.php文件在执行header( 'Location: installation/index.php' );语句之前输出了内容。检查下这个文件的“<?php”之前是否有空格之类的。
我检查了,没发现有空格之类的东西。我发现有许多人讨论乱码问题,可是没有哪几个是相同的,公说公有理,婆说婆有理,试了一个旧问题没解决,又出新难题,我都不敢搞了。

TOP

Re: 反馈

引用:
原帖由 superpeter 发表
引用:
原帖由 jklin 发表
[quote]原帖由 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
不知道是什么原因。
看样子是你的index.php文件在执行header( 'Location: installation/index.php' );语句之前输出了内容。检查下这个文件的“<?php”之前是否有空格之类的。
我检查了,没发现有空格之类的东西。我发现有许多人讨论乱码问题,可是没有哪几个是相同的,公说公有理,婆说婆有理,试了一个旧问题没解决,又出新难题,我都不敢搞了。[/quote]
那你可以换PHP 4.4.0和MySQL 4.0.X试试。使用原来的gb2312版

TOP

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,也要换吗?这种的就不必换了吧.

TOP

关于字符编码,我还是从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是中国所有非手持/嵌入式计算机系统的强制实施标准.
mambo整合discuz同步注册登录,全站utf-8编码,php5+mysql5
http://www.bytea.net

TOP

发新话题