乱码

Serendipity中文乱码解决方案 (3)

本文讨论的是如何消除内置插件“serendipity_archives_plugin”和侧栏插件“serendipity_plugin_comments”在页面显示的时候出现乱码的问题。

本文适用于Serendipity v0.8.x到v1.0。

乱码可能只在特定的情况下出现。

出现乱码的可能原因有几个,例如系统不支持多字节函数、使用了wordwrap等不支持多字节的函数等。

以下用Serendipity v1.0代码举例说明。该系统采用了简体中文(utf-8)编码。

1. 解决内置插件“serendipity_archives_plugin”的乱码

在文件“./include/lang.inc.php”中,函数serendipity_mb()里,第63行代码原先为:

return mb_strtoupper(mb_substr($args[1], 0, 1)) . mb_substr($args[1], 1);

将其修改为:

return mb_strtoupper(mb_substr($args[1], 0, 1, mb_detect_encoding($args[1])), mb_detect_encoding($args[1])) . mb_substr($args[1], 1, mb_strlen($args[1], mb_detect_encoding($args[1])), mb_detect_encoding($args[1]));

这其实可能是多此一举的做法,因为一般默认相关的多字节函数会自动选取默认编码,不需要明确写出来。但是不知何处有bug(也许是PHP的,也许是Serendipity的,也许是我所作的配置方面的),使得这里必须明确说明所采用的编码。

2. 解决侧栏插件“serendipity_plugin_comments”的乱码

在文件“serendipity_plugin_comments.php”中,函数generate_content(&$title)里,从153行到202行左右,做2个工作:

2.1 将“$serendipity['lang'] == "ja"”改成“$serendipity['lang'] == "cn"”;1

2.2 将mb_strimwidth和mb_strlen等多字节函数全部加上编码参数。例如,

原先:mb_strlen( $comment)

现在:mb_strlen( $comment, mb_detect_encoding($comment))

[注1] 看上去这段像小日本写的代码,只顾自己,不顾别人。

[补充说明1] 本文的方法可能不是治本的方法。该系统太大,因此调试困难。

[补充说明2] 我昨天已向Serendipity官方提出这个bug及其解决方法。其技术人员已将相关代码修改,因此该bug将不会出现在下一个版本的Serendipity中。2006-06-23 10:03:44

[补充说明3] 如欲浏览更多关于Serendipity的使用、维护信息,请参考《网志程序Serendipity中文维护个人文集》一文。2007-07-15 14:23:19

类别:

如何修复eGroupWare邮件乱码问题

程序: eGroupWare
版本: v1.0.0.009
问题: 邮件显示标题和内容均为乱码。此现象应该会出现在所有使用东亚文字的该系统中。
文件: email/inc/class.mail_msg_base.inc.php
函数: htmlspecialchars_encode($str, $charset='')
行数: 5188-5191左右


改写为:
1 if (!$charset)
2 {
3 $charset = "gb2312"; // 修改,仅对中文简体有效
4 }
5 $str = mb_convert_encoding($str, "UTF-8", $charset); // 新增
6 $str = htmlentities($str, ENT_QUOTES, $charset);

[补充说明1] 该bug同样出现在eGroupWare v1.0.0.007中。Deminy所提供的是一个治标的方法,并未全面研究email部分代码,只解决了邮件阅读时的乱码的问题,但未解决发送的邮件中的乱码问题。

[补充说明2] 该系统多处调用函数htmlspecialchars_encode时,并未使用第二个参数,导致该系统的邮件部分并未能实现真正的支持多语言。

类别:

Serendipity中文乱码解决方案 (2)

(接上篇“Serendipity的RSS中文乱码解决方案 (1)”)

前言

上篇谈到了如何使用UTF-8编码解决Serendipity的RSS中文乱码问题。但是很多时候,我们用中文网页的时候不喜欢网页编码是UTF-8,而希望直接用GB2312编码。在这种情况下,如何解决RSS乱码的问题呢?

进一步的原因分析

风传Serendipity是几位PHP业界高手联手开发的杰作,因此我们有理由相信这是一套可以作为程序开发范例的系统。因此,在语言国际化方面,不大应该出现编码方面的瑕疵。基于上述考虑,我们有理由相信Serendipity既能支持“Simplified Chinese (UTF-8)”编码,也能支持“Simplified Chinese (GB2312)”编码。实际上,“雪人阁”网站使用的Serendipity就采用的是“Simplified Chinese (GB2312)”编码,而且没有出现乱码问题。

由此,把所有语言选项设置为“Simplified Chinese (GB2312)”编码后,对程序管理界面、数据库等做进一步测试,未发现任何不妥之处。再对出现问题的RSS程序做进一步分析,终于发现问题所在:

默认Serendipity的所有feeds(指RSS、Atom等)都是统一采用UTF-8编码的。因此,当Serendipity系统本身采用其它编码的时候,需要将其它编码的字符串转换成UTF-8编码,再输出到相应的页面中。这个编码转换的工作,是由include/functions.inc.php文件中的一个函数serendipity_utf8_encode()实现的。该函数需要使用iconv函数库,否则将采用utf8_encode()进行编码转换。

因此,如果服务器的PHP嵌入了iconv库的话,那么,就不会有乱码的问题了;但是如果没有嵌入iconv库的话,Serendipity系统将调用utf8_encode()函数,但因为某种原因(不详)调用utf8_encode()后得到的字符串在页面上是乱码的效果。

解决方案(2种):

1. 在服务器上安装iconv库。有关PHP中iconv库的相关信息,参见这里

2. 如果想用GB2312编码,但没有iconv库,则可以将Serendipity系统从多语言/多编码支持转换为单语言支持。具体来讲,就是把rss.php文件中的“2个upf-8”字符串修改为“gb2312”,把include/functions.inc.php文件中的函数serendipity_utf8_encode()改写,让它直接返回输入字符串。其它可能出现乱码的地方用同样的方式处理。目前,qingqing.us就是采用这个做法。

(完)

[补充说明1] 本文原名为《Serendipity的RSS中文乱码解决方案 (2)》,现更名为《Serendipity中文乱码解决方案 (2)》,以便和后续类似文章的命名统一起来。另,本文比较古老,所述内容(以后)可能过时。2006-06-22 20:06:21

[补充说明2] 如欲浏览更多关于Serendipity的使用、维护信息,请参考《网志程序Serendipity中文维护个人文集》一文。2007-07-15 14:23:19

类别:

Serendipity中文乱码解决方案 (1)

简介

Serendipity是一个用PHP+MySQL开发的非常出色的Blog程序*,拥有众多的特性和功能:界面简单、功能强大的编辑界面、用户评论、多级分类、反垃圾功能、多插件、Trackback and Pingback、国际化语言支持、超强兼容性(兼容XHTML、CSS、RSS、ATOM等)等。

在当前最新版的Serendipity (v0.8.4)中,支持如下两种中文简体编码:“Simplified Chinese (GB2312)”和“Simplified Chinese (UTF-8)”。

在当前最新版的Serendipity (v0.8.4)中,有2处编码选项设定:一是在“Administration->管理设定->一般设定->语系”(此为全局编码设定),一是在“Administration->管理作者->作者/编辑->语系”(此为用户编码设定)。以下所有关于编码编辑/修改的地方,均指需要同时修改这2处的编码选择。(注意,因为翻译的原因,此处“语系”和“编码”是同一个意思)

问题/现象

如果界面编码选择“Simplified Chinese (GB2312)”,用户会发现Blog主界面等中文显示都很正常,但所有聚合页面(RSS等)都是乱码。

解决方案(2种):

1. 如果是新安装的话,界面编码选择“Simplified Chinese (UTF-8)”,则一切正常了。

2. 如果用户设定的界面编码是“Simplified Chinese (GB2312)”,并且在此状态下发表了多篇文字,那么,首先要把MySQL数据库内的内容编码进行一次转换操作(从GB2312转换到UTF-8),然后把Serendipity的界面编码选择为“Simplified Chinese (UTF-8)”,则一切正常了。

如何进行MySQL数据库内容编码的转换?参见文章“关于GB2312/Big5中文WordPress站点向UTF-8的转换”。其实操作非常简单,就是在phpMyAdmin数据转换时,“导出时用gb2312/big5 (zh/zh-tw),导入时用 zh-utf-8/zh-tw-utf-8。

[补充说明*] 在建立qingqing.us网站的Blog的时候,Deminy曾对网上流行的几套基于PHP的Blog程序(国产程序除外)作过简单的评测,初步认定Serendipity是这几套程序当中最棒的。

(接下篇“Serendipity的RSS中文乱码解决方案 (2)”)

[补充说明1] 本文原名为《Serendipity的RSS中文乱码解决方案 (1)》,现更名为《Serendipity中文乱码解决方案 (1)》,以便和后续类似文章的命名统一起来。另,本文比较古老,所述内容(以后)可能过时。2006-06-22 20:06:21

[补充说明2] 如欲浏览更多关于Serendipity的使用、维护信息,请参考《网志程序Serendipity中文维护个人文集》一文。2007-07-15 14:23:19

类别: