PHP获取UTF8格式的字符串的一部分

Web 十五楼的鸟儿 2047浏览 0评论

用来截取UTF8字符串的很实用的一个函数,函数来自ZBLOG PHP版本。

该函数考虑了较多的兼容情况,而不需要担心有些函数不存在不能使用的问题。

/**
 *  获取UTF8格式的字符串的子串
 * @param string $sourcestr 源字符串
 * @param int $cutlength 子串长度
 * @return string 
*/
function SubStrUTF8($sourcestr, $cutlength) {

    if( function_exists('mb_substr') && function_exists('mb_internal_encoding') ){
        mb_internal_encoding('UTF-8');
        return mb_substr($sourcestr, 0, $cutlength);
    }

    if( function_exists('iconv_substr') && function_exists('iconv_set_encoding') ){
        iconv_set_encoding ( "internal_encoding" ,  "UTF-8" );
        iconv_set_encoding ( "output_encoding" ,  "UTF-8" );
        return iconv_substr($sourcestr, 0, $cutlength);
    }

    $returnstr = '';
    $i = 0;
    $n = 0;

    $str_length = strlen($sourcestr); //字符串的字节数

    while (($n < $cutlength) and ($i <= $str_length)) {
        $temp_str = substr($sourcestr, $i, 1);
        $ascnum = Ord($temp_str); //得到字符串中第$i位字符的ascii码
        if ($ascnum >= 224) //如果ASCII位高与224,
        {

            $returnstr = $returnstr . substr($sourcestr, $i, 3); //根据UTF-8编码规范,将3个连续的字符计为单个字符
            $i = $i + 3; //实际Byte计为3
            $n++; //字串长度计1
        } elseif ($ascnum >= 192) //如果ASCII位高与192,
        {
            $returnstr = $returnstr . substr($sourcestr, $i, 2); //根据UTF-8编码规范,将2个连续的字符计为单个字符
            $i = $i + 2; //实际Byte计为2
            $n++; //字串长度计1
        } elseif ($ascnum >= 65 && $ascnum <= 90) //如果是大写字母,
        {

            $returnstr = $returnstr . substr($sourcestr, $i, 1);
            $i = $i + 1; //实际的Byte数仍计1个
            $n++; //但考虑整体美观,大写字母计成一个高位字符

        } else //其他情况下,包括小写字母和半角标点符号,
        {

            $returnstr = $returnstr . substr($sourcestr, $i, 1);
            $i = $i + 1; //实际的Byte数计1个
            $n = $n + 0.5; //小写字母和半角标点等与半个高位字符宽...

        }
    }
    if ($str_length > $cutlength) {
        $returnstr = $returnstr;
    }

    return $returnstr;

}


转载请注明:鸟儿博客 » PHP获取UTF8格式的字符串的一部分

游客
发表我的评论 换个身份
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

等待大佬打赏中~