php pack不支持中文,» 完美解决All in One SEO Pack对中文支持不友好的问题

大家都知道All in One SEO Pack是wordpress的一个搜索引擎优化的插件,但它对中文支持不友好。修改它的代码可以完美支持中文。

All in One SEO对英文支持很好的。因为它只考虑的单字节语言的情况,没有考虑多字节(例如中文等非英文的语言)的情况。

问题介绍

All in One SEO Pack只截取英文空格(" ")之前的内容作为description(描述)的内容,但是我们写中文博客,多数不会在文章中出现英文空格,更别说在开头的恰当位置了,所以中文博客用它就就悲剧了,只生成很短的描述,甚至不生成描述。

解决方法

在{wordpress目录}/wp-content/plugins/all-in-one-seo-pack/aioseop.class.php文件中搜索function trim_excerpt_without_filters方法,类似这样的:

function trim_excerpt_without_filters($text) {

$text = str_replace(']]>', ']]>', $text);

$text = preg_replace( '|[(.+?)](.+?[/\1])?|s', '', $text );

$text = strip_tags($text);

$max = $this->maximum_description_length;

if ($max < strlen($text)) {

while($text[$max] != ' ' && $max > $this->minimum_description_length) {

$max--;

}

}

$text = substr($text, 0, $max);

return trim(stripcslashes($text));

}

使用下面的代码替换掉上面的代码即可。

function trim_excerpt_without_filters($text) {

$text = str_replace(']]>', ']]>', $text);

$text = preg_replace( '|[(.+?)](.+?[/\1])?|s', '', $text );

$text = strip_tags($text);

$max = $this->maximum_description_length;

if ($max < strlen($text)) {

while((ord($text[$max]) & 0x80) != 0 && (ord($text[$max]) & 0x40) == 0 &&

$max > $this->minimum_description_length) {

$max--;

}

}

$text = substr($text, 0, $max);

return trim(stripcslashes($text));

}

2013-5-11更新

上面的代码适用于All In One SEO Pack插件的1.x版本,在2.0.3及之后版本中被重新设计了,但是我们依然能够找到并修改之。

在{wordpress目录}/wp-content/plugins/all-in-one-seo-pack/aioseop_class.php文件中搜索function trim_excerpt_without_filters方法,类似这样的:

function trim_excerpt_without_filters( $text, $max = 0 ) {

$text = str_replace( ']]>', ']]>', $text );

$text = preg_replace( '|[(.+?)](.+?[/\1])?|s', '', $text );

$text = strip_tags( $text );

if ( !$max ) $max = $this->maximum_description_length;

if ( $max < $this->strlen( $text ) ) {

while( $text[$max] != ' ' && $max > $this->minimum_description_length ) {

$max--;

}

}

$text = substr( $text, 0, $max );

return trim( stripcslashes( $text ) );

}

使用下面的代码替换掉上面的代码即可。

function trim_excerpt_without_filters( $text, $max = 0 ) {

$text = str_replace( ']]>', ']]>', $text );

$text = preg_replace( '|[(.+?)](.+?[/\1])?|s', '', $text );

$text = strip_tags( $text );

if ( !$max ) $max = $this->maximum_description_length;

if ( $max < $this->strlen( $text ) ) {

while((ord($text[$max]) & 0x80) != 0 && (ord($text[$max]) & 0x40) == 0

&& $max > $this->minimum_description_length ) {

$max--;

}

}

$text = substr( $text, 0, $max );

return trim( stripcslashes( $text ) );

}

修改后覆盖到空间,description描述信息就会出现了。

2014-8-18更新

如果不想自己修改代码,可以从github下载已经修改好的代码。这里提供2.1.4及更新的所有版本的修改。

如果没有你所需要的版本,请提交issues或pr,也可以直接在本页面留言,我将会尽快更新。

注意:修改过的版本以for chinese开头,比如2.1.4版本的为for chinese v2.1.4

解决原理

wordpress的博客多数都是UTF8格式的,那么我们只需要研究下UTF8格式就好了,当然如果使用gbk或者跟utf8不兼容的格式,那么这个方法是不可行的。

UTF-8是一种变长的编码方式。它可以使用1~4个字节表示一个符号(字),根据不同的符号而变化字节长度。

UTF-8的编码规则很简单,只有二条:

对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

下表总结了编码规则,字母x表示可用编码的位。

Unicode符号范围 | UTF-8编码方式

(十六进制) | (二进制)

--------------------+---------------------------------------------

0000 0000-0000 007F | 0xxxxxxx

0000 0080-0000 07FF | 110xxxxx 10xxxxxx

0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx

0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

0020 0000-03FF FFFF | 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

0400 0000-7FFF FFFF | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

那么我们只要以一个字的第一个字节处结束(不包含该字节)就能获取完整的字符串了,也不会有乱码产生。

从上面的编码规则可以看出,如果一个字节的最高位为0,或者前两个高位都为1,那么这个字节一定是一个字的第一个字节。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值