时间: 2008-06-08 / 分类: WEB后端编程 - 开发与实践 / 浏览次数: / 0 个评论 发表评论
php的中文截取函数
项目前端开发的架构
WEB前端开发中的一些编程风格和书...
黄金分割与摄影构图
12条经典摄影技巧

为了防止php用substr截取中文字符发生乱码的情况,主要是substr这个函数函数虽然也可以分割文字,但要分割的文字如果包括中文字符往往会遇到问题,会有可能硬生生的将一个中文字符“锯”成两半,这时可以用mb_substr()或者mb_strcut()这个函数,()/mb_strcut的用法与substr()相似,只是在mb_substr()/mb_strcut最后要加入多一个参数,以设定字符串的编码;

如果服务器没打开php_mbstring.dll,需要在php.ini在把php_mbstring.dll打开:

1.确保你的Windows/system32下有php_mbstring.dll这个文件,没有就从你Php安装目录extensions里拷入Windows/system32里面。

2.在windows目录下找到php.ini打开编辑,搜索mbstring.dll,找到
;extension=_mbstring.dll
把前面的;号去掉,这样mb_substr函数就可以生效了
mb_strcut函数功能也可以截取字符串长度,区别主要在于:

mb_substr是按字来切分字符,而mb_strcut是按字节来切分字符,但是都不会产生半个字符的现象。

PHP手册中mbstring 函数的说明:
php的mbstring扩展模块提供了多字节字符的处理能力,平常最常用的就是用mbstring来切分多字节的中文字符,这样可以避免出现半个字符的情况,由于是php的扩展,它的性能也要比一些自定义的多字节切分函数要好上一些。

mbstring extension提供了几个功能类似的函数,mb_substr和mb_strcut,手册上的解释。

mb_substr
mb_substr() returns the portion of str specified by the start and length parameters.

mb_substr() performs multi-byte safe substr() operation based on number of characters. Position is counted from the beginning of str. First character’s position is 0. Second character position is 1, and so on.


mb_strcut() returns the portion of str specified by the start and length parameters.

mb_strcut() performs equivalent operation as mb_substr() with different method. If start position is multi-byte character’s second byte or larger, it starts from first byte of multi-byte character.

It subtracts string from str that is shorter than length AND character that is not part of multi-byte string or not being middle of shift sequence.

再举个例子,有一段文字, 分别用mb_substr和mb_strcut来做切分:

<?php
$str = ‘我是一串比较长的中文-www.amiku.cn’;

echo “mb_substr:” . mb_substr($str, 0, 6, ‘utf-8’);

echo “<br>”;

echo “mb_strcut:” . mb_strcut($str, 0, 6, ‘utf-8’);
?>

输出结果如下:

mb_substr:我是一串比较
mb_strcut:我是 

PHP自己写一个函数,当用于不支持mb_substr的地方

// Patch in multibyte support
if (!function_exists(‘mb_substr’)) {
    function mb_substr($str, $start, $len = ”, $encoding=”UTF-8″){
        $limit = strlen($str);
 
        for ($s = 0; $start > 0;–$start) {// found the real start
            if ($s >= $limit)
                break;
 
            if ($str[$s] <= “\x7F”)
                ++$s;
            else {
                ++$s; // skip length
 
                while ($str[$s] >= “\x80” && $str[$s] <= “\xBF”)
                    ++$s;
            }
        }

或者另一种方法,实现PHP中文字串截取无乱码的方法

function GBsubstr($string, $start, $length) {
if(strlen($string)>$length){
   $str=null;
   $len=$start+$length;
   for($i=$start;$i<$len;$i++){
    if(ord(substr($string,$i,1))>0xa0){
     $str.=substr($string,$i,2);
     $i++;
    }else{
     $str.=substr($string,$i,1);
    }
   }
   return $str.’…’;
}else{
   return $string;
}
}
 
        if ($len == ”)
            return substr($str, $s);
        else
            for ($e = $s; $len > 0; –$len) {//found the real end
                if ($e >= $limit)
                    break;
 
                if ($str[$e] <= “\x7F”)
                    ++$e;
                else {
                    ++$e;//skip length
 
                    while ($str[$e] >= “\x80” && $str[$e] <= “\xBF” && $e < $limit)
                        ++$e;
                }
            }
 
        return substr($str, $s, $e – $s);
    }
}

PHP的中文字符串截取总结:

1、使用mbstring扩展库的mb_substr截取就不会出现乱码了。

2、自己书写截取函数,但效率不如用mbstring扩展库来得高。

3、如果仅是为了输出截取的串,可用如下方式实现:substr($str, 0, 30).chr(0)。

      站点地图 | 关于我 | 返回顶部
    Copyright © 2001-2013 { amiku.cn | zhangshunjin.com }. Powered by 

    阿米酷

    张顺金


    浙ICP备11002820号-1