All in One SEO 中文环境下的一个 Bug

All in One SEO 是一个进行 Wordprss SEO 优化的插件,它能够重写 Wordprss 页面的 title 以利于搜索引擎收录,但是这个插件有一个 bug 当你使用的 Tag 是中文时,title中显示的第一个字符会是乱码,检查后发现是插件会试图将英文单词第一个字符转成大写,本身中文就是多字节字符,substr再 strtoupper,了解 php 中文处理的人就应该知道肯定会出问题了…

为了解决这个问题我将插件中的 capitalize 方法(function capitalize)修改如下:

[php]
function capitalize($s)
{
$s = trim($s);
$tokens = explode(‘ ‘, $s);
for ($i = 0, $n = count($tokens); $i < $n; $i++)
{
$matches = array();
preg_match(‘/^(.{1})(.*)$/us’, $tokens[$i], $matches);
$tokens[$i] = strtr($matches[1], ‘abcdefghijklmnopqrstuvwxyz’, ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’) . $matches[2];
}
$s = implode(‘ ‘, $tokens);
return $s;
}[/php]

这样 title 就不会出现乱码了。

2007.11.12更新:
我光注意到Tag中文有错误,没注意到分类的title中文也会乱码,感谢 funyfan 提醒。

搜索all_in_one_seo_pack.php中全部的ucwords替换为$this->capitalize,如此即可避免上述问题,其实ucwords做的事情和capitalize方法是一样的,不过ucwords是php原生函数,同样的不支持多字节字符处理。All in One SEO在这个地方的处理思路看起来还是够不统一啊,虽然说一样都有问题,呵呵。

2009.04.17:

新版的 All in One SEO 已经解决了这个问题,我直接升级使用没发现还有乱码了

5 thoughts on “All in One SEO 中文环境下的一个 Bug

  1. 我也遇到了。
    恩,会引用你的文章,不过现在还在本地折腾,嘿嘿:)

    多谢了

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据