php中文字符串截取乱码问题解决方法
发布:smiling 来源: PHP粉丝网 添加日期:2013-12-04 21:44:21 浏览: 评论:0
出现中文截取乱码的问题一般是中文文合混时比较多,如果你截取英文不会有问题,中文就会有,主要原因是:字符串编码为UTF-8的,一个中文字符占三个字节而字符串编码为GB2312的,一个中文字符占两个字节了,下面我来先来看实例。
字符串编码为GB2312的,一个中文字符占两个字节,代码如下:
- public static function chinesesubstr($str, $start, $len) { // $str指字符串,$start指字符串的起始位置,$len指字符串长度
- $strlen = $start + $len; // 用$strlen存储字符串的总长度,即从字符串的起始位置到字符串的总长度
- for($i = $start; $i < $strlen;) {
- if (ord ( substr ( $str, $i, 1 ) ) > 0xa0) { // 如果字符串中首个字节的ASCII序数值大于0xa0,则表示汉字
- $tmpstr .= substr ( $str, $i, 2 ); // 每次取出两位字符赋给变量$tmpstr,即等于一个汉字
- $i=$i+2; // 变量自加2
- } else{
- $tmpstr .= substr ( $str, $i, 1 ); // 如果不是汉字,则每次取出一位字符赋给变量$tmpstr
- $i++;
- }
- }
- return $tmpstr; // 返回字符串
- }
字符串编码为UTF-8的,一个中文字符占三个字节,代码如下:
- public static function chinesesubstr($str, $start, $len) { // $str指字符串,$start指字符串的起始位置,$len指字符串长度
- $strlen = $start + $len; // 用$strlen存储字符串的总长度,即从字符串的起始位置到字符串的总长度
- for($i = $start; $i < $strlen;) {
- if (ord ( substr ( $str, $i, 1 ) ) > 0xa0) { // 如果字符串中首个字节的ASCII序数值大于0xa0,则表示汉字
- $tmpstr .= substr ( $str, $i, 3 ); // 每次取出三位字符赋给变量$tmpstr,即等于一个汉字
- $i=$i+3; // 变量自加3
- } else{
- $tmpstr .= substr ( $str, $i, 1 ); // 如果不是汉字,则每次取出一位字符赋给变量$tmpstr
- $i++;
- }
- }
- return $tmpstr; // 返回字符串
- }
上面虽然解决了这个问题,但是要注意编码问题,相对来说比较麻烦,下面写了一个不管什么编码都没问题的解决办法,代码如下:
- /**
- * Utf-8、gb2312都支持的汉字截取函数
- * cut_str(字符串, 截取长度, 开始长度, 编码);
- * 编码默认为 utf-8
- * 开始长度默认为 0
- */
- function cut_str($string, $sublen, $start = 0, $code = 'UTF-8')
- {
- if($code == 'UTF-8')
- {
- $pa = "/[x01-x7f]|[xc2-xdf][x80-xbf]|xe0[xa0-xbf][x80-xbf]|[xe1-xef][x80-xbf][x80-xbf]|xf0[x90-xbf][x80-xbf][x80-xbf]|[xf1-xf7][x80-xbf][x80-xbf][x80-xbf]/";
- preg_match_all($pa, $string, $t_string);
- if(count($t_string[0]) - $start > $sublen) return join('', array_slice($t_string[0], $start, $sublen))."…";
- return join('', array_slice($t_string[0], $start, $sublen));
- }
- else
- {
- $start = $start*2;
- $sublen = $sublen*2;
- $strlen = strlen($string);
- $tmpstr = '';
- for($i=0; $i< $strlen; $i++)
- {
- if($i>=$start && $i< ($start+$sublen))
- {
- if(ord(substr($string, $i, 1))>129)
- {
- $tmpstr.= substr($string, $i, 2);
- }
- else
- {
- $tmpstr.= substr($string, $i, 1);
- }
- }
- if(ord(substr($string, $i, 1))>129) $i++;
- }
- if(strlen($tmpstr)< $strlen ) $tmpstr.= "…";
- return $tmpstr;
- }
- }
Tags: 中文 字符串 截取 乱码
相关文章
- ·PHP中文乱码问题及解决方法(2013-11-27)
- ·PHP中文URL编解码详细说明(2013-11-28)
- ·php中文目录 include错误解决(2013-11-29)
- ·在php中中文乱码解决方法(2013-11-29)
- ·php json_encode中文乱码解决办法(2013-11-29)
- ·php开发中常见的中文乱码处理办法(2013-11-30)
- ·php+jquery+json中文乱码(2013-11-30)
- ·php和mysql中uft-8中文编码乱码的几种解决办法(2013-11-30)
- ·php+CKFinder上传中文名文件乱码问题的解决方法(2013-12-02)
- ·phpMyAdmin显示中文乱码的解决方法(2013-12-02)
- ·php导出excel中文乱码解决办法总结(2013-12-03)
- ·PHP连接MySQL数据库中文乱码解决方法(2013-12-03)
- ·php中json_encode中文字符乱码解决办法(2013-12-03)
- ·PHP中截取中文乱码解决办法(2013-12-03)
- ·json_encode 中文显示问题解决方法(2013-12-04)
- ·防止纯PHP页面中文乱码技巧(2013-12-07)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)