玩WordPress » 技巧方法 » 2009 » 03 » 07 » seems_utf8函数与完美截断中文字符串

seems_utf8函数与完美截断中文字符串

seems_utf8是我刚才翻codex时发现的一个有趣的函数。

<?php seems_utf8( $Str ) ?> 

它的作用是判断提供的字符$Str是否是utf8编码的,如果是utf8编码的返回true,否则返回false

中文字符串的截断问题一直是php中比较让人头疼的问题,虽然你问谷哥可以得到很多方法解决这个问题,但既然WordPress已经提供了判断字符是否是utf8的函数,那为何不进行利用一下呢?

以下就是我利用上述函数得到的一个用于截断包含中文的字符串的一个函数:

/**
 * cut_str用于截断包含中文(或其他多字节?)的utf8编码的字符串
 * @param string $str utf8编码的字符串
 * @param int $len 需要截取的长度(单位是字节)
 */
function cut_str($str, $len) {
    if (!isset($str[$len])) {
        // 判断字符串长度是否已经达到需要截取的长度
        // 未达到时,直接输出原字符串
    } else {
        if (seems_utf8($str[$len-1])) // 判断截断字符串的最后一个字符是否是utf8编码的
            $str = substr($str, 0, $len); // 如果是utf8编码的,直接截断输出
        else { // 如果不是utf8编码的,因为utf8编码的中文是三个字节进行保存的,则判断该字符和周围字符组成的字符串是否符合utf8编码
            if(seems_utf8($str[$len-3].$str[$len-2].$str[$len-1]))
                $str = substr($str, 0, $len-3) . $str[$len-3] . $str[$len-2] . $str[$len-1];

            elseif(seems_utf8($str[$len-2].$str[$len-1].$str[$len]))
                $str = substr($str, 0, $len-2) . $str[$len-2].$str[$len-1].$str[$len];

            elseif(seems_utf8($str[$len-1].$str[$len].$str[$len+1]))
                $str = substr($str, 0, $len-1) . $str[$len-1].$str[$len].$str[$len+1];

            else // 这个else应该不用也是可以的
                $str = substr($str, 0, $len);
        }
    }
    echo $str;
}

使用方法:

$str = 'dkjkio看看看看看';
cut_str($str, 10);

上面输出的结果是:dkjkio看看

数一数,只是8个字符啊,我可是要截取10个字符的?上面函数中的解释已经说过了,utf8编码的中文是用3个字节进行保存的,其实上面的结果已经有12个字节了。所以你在使用的时候要考虑到这一点,不要以为截取的已经足够长了,其实得到的却只有寥寥几个字而已。

使用条件:
在WordPress的插件或主题中使用,并且WordPress版本大于等于1.2.1(呵呵,应该没人用0.9吧 :mrgreen:

9 Responses to “seems_utf8函数与完美截断中文字符串”

  1. calmblue says:

    其实php有两个更好的函数,mb_substr和mb_strcut。
    如果php版本不低于4.0.6的话,可以考虑使用这两个函数之一。

    • 冰古 says:

      mb函数都是要编译才能使用的,一般虚拟主机如果没有编译的话,就不能用了,所以WordPress都不推荐使用的。
      如果你有看WordPress的代码的话,你会发现她的代码都是兼容PHP4的(例如class都是没有使用public,private等PHP5才有的关键字),也就是说WordPress比较看重兼容。

  2. 浆糊 says:

    恩,如果截取长度不是10,而是100,会发生什么情况呢?嘻嘻

  3. […] 本文原作者:冰古 – seems_utf8函数与完美截断中文字符串 […]

  4. […] 再然后截取内容的前面n个字节(这里使用了我之前写的WordPress可用的截断中文字符的函数); […]

  5. […] 再然后截取内容的前面n个字节(这里使用了我之前写的WordPress可用的截断中文字符的函数); […]

  6. […] 再然后截取内容的前面n个字节(这里使用了我之前写的WordPress可用的截断中文字符的函数); […]