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
类别: 

评论

你好,很高兴认识你,在网上找了很久,中文使用serendipity的也就你一人研究的最为深入了。我也经历很久的选择才放弃了原来的WP及其他的BSP服务商的blog系统。

很感谢你提供了serendipity的丰富资料,我的插件基本都是按照你的推荐安装的,谢谢你。

另外还有几个问题想跟你讨教一下:
1。我记得在0.8版左右的时候,有一个可以在后台直接添加友情链接的插件的,不知道为何现在找不到了?可能是我英文不好,不知道哪个才是的。差不多插件我都试过了,可就是没找到那个。

2。在前台现实引用链接的地方(点击一下弹出一个对话框)“引用此文章特定的 URI (网址) ”这里,鼠标放在文字上的时候,现实的中文的正常,点击一下,弹出对话框则是乱骂,请问是怎么回事?有什么办法可以解决?(按照你本篇的介绍方法也还是未能解决)
如:http://blog.nroe.net/archives/1-Microsoft-ActiveSync-4.2-4876.html

3。经常遇到的,serendipity从0.6我都装过很多次,又删了很多次,原因是,在添加一部分插件之后,再想装其他插件,插件列表则现实不出来了?换其他插件安装服务器网址(如官方的s9y.org)则可以显示出来,但插件都是已经安装过的了。往往出现这种插件列表显示不出来的时候,我就放弃使用serendipity了。请问你有没有遇到这样的情况?是如何解决的呢?

4。FTP空间里的plugins里的不要文件想删掉的话,删不掉,说是没有权限,更改777权限也无法更改。请问你有没有遇到这样的情况呢?如何解决的?

非常感谢你能在百忙之中解答一下我的问题。国内使用serendipity太少,资源教程相对来说也很少。serendipity是一个不错的架设blog选择。

祝你在国外生活愉快、平平安安。

1. 我想你说的应该是“Link List” (serendipity_event_linklist) 这个友情链接插件(属于侧栏插件)。

2. 这个问题至少出现在v0.8.3到v1.0 beta x之间,但在最新版的v1.0中(的某些模版中)似乎已经解决了。这个问题出现在很多模版中,如果你觉得还没有解决,参考如下方法:

在你使用的模板文件中,将文件“templates/.../entries.tpl”中的

alert('{$CONST.TRACKBACK_SPECIFIC_ON_CLICK|@escape:htmlall}');

改成

alert('{$CONST.TRACKBACK_SPECIFIC_ON_CLICK|@escape:html}');

因为这个bug和Serendipity系统的代码没什么直接关系(只是模版文件的问题),因此我也从来没把这个问题当成重要的乱码问题而提及其解决办法。

3. 你是指使用Spartacus(一个管理插件库的插件)的时候,想浏览网上的插件库插件列表(而非本地安装的插件列表)时候看不见其列表?

你所说的问题我从未发现过。只是有时候我需要更改Spartacus选项中的“文件/镜像位置”(File/Mirror location)选项,选择相应的插件库存放服务器。因为不是每台服务器都时时正常工作。

另外,已经安装的插件的排列顺序有时候是比较重要的,因为排在前面的插件有可能会对排在后面的插件产生影响,使后面的插件不能正常配置、不能正常工作。这种情况不多,但有发生。(因此,是否需要更改Spartacus在本地已安装插件列表中的位置?不详)

4. 这和serendipity无关。在这种情况下,文件属主(文件拥有者)可能是不一样的。比如,你用FTP/SCP方式上传了文件,文件拥有者是deminy;你使用网页访问网站、上传文件的时候,服务器自动生成了一些文件,文件拥有者可能是www。这种情况下,你不可能在FTP方式下(用户身份为deminy)把这些属于用户www的文件删除。

在上例中,可行的删除方式是:使用网页上传的文件,也通过网页管理页面删除。

祝你好运。

问题1已经搞定,虽然不是我之前想要的那种,不过有总比没有要好,呵呵
我印象中原来的添加友情链接的插件,是有3、4个表单式的,就是常见的那种友情链接的添加方式,不知道现在为什么没有了。

问题2依然没有解决,换了几个模板也不行。

问题3,是有你说的那种情况,插件之间有互相影响的。删掉部分之后就可以看到插件列表了。

问题4也了解了,谢谢你的解答~~非常非常感谢!!!!!

请问deminy,我的s9y,始终在comment最下方有“发布的回响将需要管理员的审核”,我实在找不到地方取消此设置。
您能指点一下吗?

我找到原因了--我是从wordpress转为s9y的,但是s9y_entries里的moderate_comments设置为true,改为false就OK了。

在管理界面的“回响”->“设置垃圾屏蔽的方法”;或者在管理界面的“设定外挂”->“垃圾评论屏蔽”。

添加新评论

友情提醒:您的言论自由在本站会得到充分保证;不过,由于广告留言等猖獗,因此本站的内容过滤系统有可能会暂时屏蔽您新发的留言或评论。不便之处,希望理解。