Home > php教程 > php手册 > body text

PHP中截取中文乱码解决办法

WBOY
Release: 2016-05-25 16:52:35
Original
1186 people have browsed it

如果ASCii码大于0xa0就是半个汉字;了解substr()、mb_substr()、ord()。 现在常用的编码格式是UTF8,GBK,GBK2312,BIG5。GBK是GBK2312的升级。现在我开发中遇到的基本都是UTF8,GBK常用在论坛BBS上。今天自己写了下UTF8的,测试下还说的过去,毕竟从网上拷下来的是可以用,但是如果有时间最好还是自己写一下,这样只有到自己手里的才是自己的。

最简的就是利用:例一

<?php
echo substr("Hello world!", 6);
//输出:world!
?>
Copy after login

例二:

<?php
echo substr("Hello world!", 6, 5);
?>
Copy after login


英文的话没有问题,但是中文就出问题了,下面我们使用mb_substr函数处理。

<?php
/** 
 *——————————————————————————————————————————————————————————————————————————
 *PHP有一个mbstring扩展库可以用(有朋友面试PHP的时候还被问到过这个问题哦),但是  *
 一般的服务器都没打开php_mbstring.dll,需要在
 *php.ini里把php_mbstring.dll打开,如果没有权限的话就只有联系你的ISP了。
 *因为mb_string的效率高一些,所以我们先检查一下mb_string是否可以用:
 *——————————————————————————————————————————————————————————————————————————
 */
?>
<?php
if (function_exists(&#39;mb_string&#39;)) {
    mb_substr($string, $start, $length, $encoding);
    //other codes here
    
} else mysubstr($string, $start, $length); // 调用自己的函数
?>
Copy after login

首先定义自己的函数:

<?php
/** 
 *——————————————————————-
 *首先定义自己的函数:
 *——————————————————————-
 */
function mysubstr($string, $start, $length) {
    if (strlen($string) > $length) {
        $str = "";
        $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 . &#39;…&#39;;
    } else {
        return $string;
    }
}
?>
Copy after login

还有一个问题要注意,使用这种方法的时候,你的标签对里的charset只有设成中文的编码才可以,如GBK,GB2312。

下面自己常用的一个中英文字符截取函数,自定义截取中文字符串函数,基本上就是仿照mb_substr写个函数,直接调用罢了,以下为我找到的代码,其实很简单:

<?php
function substr_cn($string_input, $start, $length) {
    /* 功能:
     * 此算法用于截取中文字符串
     * 函数以单个完整字符为单位进行截取,即一个英文字符和一个中文字符均表示一个单位长度
     * 参数:
     * 参数$string为要截取的字符串,
     * 参数$start为欲截取的起始位置,
     * 参数$length为要截取的字符个数(一个汉字或英文字符都算一个)
     * 返回值:
     * 返回截取结果字符串
     * */
    $str_input = $string_input;
    $len = $length;
    $return_str = "";
    //定义空字符串
    for ($i = 0; $i < 2 * $len + 2; $i++) $return_str = $return_str . " ";
    $start_index = 0;
    //计算起始字节偏移量
    for ($i = 0; $i < $start; $i++) {
        if (ord($str_input{$start_index} >= 161)) //是汉语
        {
            $start_index+= 2;
        } else
        //是英文
        {
            $start_index+= 1;
        }
    }
    $chr_index = $start_index;
    //截取
    for ($i = 0; $i < $len; $i++) {
        $asc = ord($str_input{$chr_index});
        if ($asc >= 161) {
            $return_str{$i} = chr($asc);
            $return_str{$i + 1} = chr(ord($str_input{$chr_index + 1}));
            $len+= 1; //结束条件加1
            $i++; //位置偏移量加1
            $chr_index+= 2;
            continue;
        } else {
            $return_str{$i} = chr($asc);
            $chr_index+= 1;
        }
    }
    return trim($return_str);
} //end of substr_cn
?>
Copy after login

  


本文地址:

转载随意,但请附上文章地址:-)

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Recommendations
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!