解析使用substr截取UTF-8中文字符串出现乱码的问题

2015-01-24信息快讯网

本篇文章是对使用substr截取UTF-8中文字符串出现乱码的问题进行了详细的分析介绍,需要的朋友参考下

我们知道有时候使用substr来截取UTF-8中文字符串的时候,经常会出现乱码,为什么会出现这样的问题呢,本文告诉你答案。
看这样一段代码吧(字符编码为UTF-8):
<?
$str = '都知道strlen与mb_strlen是求字符串长度的函数';
echo strlen($str)'.<br />'.mb_strlen($str,'utf-8');
?>

运行上述代码,返回值如下:
66
34
怎么样?strlen中,中文是三个字节的长度,英文则是一个字节的长度!mb_strlen中,都被计算为一字节的长度!所以,我们有时候用substr来截取UTF-8中文字符串的时候,经常会出现乱码,就是这个原因了!
下面提供一个截取UTF-8字符串的函数:
function cutstr($sourcestr,$cutlength){
$returnstr = '';
$i = 0;
$n = 0;
$str_length = strlen($sourcestr);
$mb_str_length = mb_strlen($sourcestr,'utf-8');
while(($n < $cutlength) && ($i <= $str_length)){
$temp_str = substr($sourcestr,$i,1);
$ascnum = ord($temp_str);
if($ascnum >= 224){
$returnstr = $returnstr.substr($sourcestr,$i,3);
$i = $i + 3;
$n++;
}
elseif($ascnum >= 192){
$returnstr = $returnstr.substr($sourcestr,$i,2);
$i = $i + 2;
$n++;
}
elseif(($ascnum >= 65) && ($ascnum <= 90)){
$returnstr = $returnstr.substr($sourcestr,$i,1);
$i = $i + 1;
$n++;
}
else{
$returnstr = $returnstr.substr($sourcestr,$i,1);
$i = $i + 1;
$n = $n + 0.5;
}
}
if ($mb_str_length > $cutlength){
$returnstr = $returnstr . "...";
}
return $returnstr; 
}

使用例子:
<?
$str = '有效期最长三个月,超过有效期系统将自动删除本条信息';
//echo strlen($str);
//echo '<hr />'.mb_strlen($str,'utf-8');
echo '<hr />'.$str;
echo '<hr />'.cutstr($str,24);
?>
php stripslashes和addslashes的区别
PHP下获取上个月、下个月、本月的日期(strtotime,date)
php缓冲 output_buffering和ob_start使用介绍
linux系统下php安装mbstring扩展的二种方法
php中文乱码怎么办如何让浏览器自动识别utf-8
深入解读php中关于抽象(abstract)类和抽象方法的问题分析
php输入流php://input使用示例(php发送图片流到服务器)
php使用strtotime和date函数判断日期是否有效代码分享
PHP 正则判断中文UTF-8或GBK的思路及具体实现
php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法
php字符编码转换之gb2312转为utf8
PHP截断标题且兼容utf8和gb2312编码
浅析PHP substr,mb_substr以及mb_strcut的区别和用法
解析php利用正则表达式解决采集内容排版的问题
用Json实现PHP与JavaScript间数据交换的方法详解
php常用Output和ptions/Info函数集介绍
使用array mutisort 实现按某字段对数据排序
php读取二进制流(C语言结构体struct数据文件)的深入解析
基于PHP输出缓存(output_buffering)的深入理解
php缓冲 output_buffering的使用详解
深入PHP autoload机制的详解
PHP stripos()函数及注意事项的分析
基于session_unset与session_destroy的区别详解
基于Linux调试工具strace与gdb的常用命令总结
linux命令之调试工具strace的深入分析
『PHP』PHP截断函数mb_substr()使用介绍
phpmyadmin显示utf8_general_ci中文乱码的问题终级篇
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
php实现utf-8和GB2312编码相互转换函数代码
php验证手机号码(支持归属地查询及编码为UTF8)
PHP正确解析UTF-8字符串技巧应用
©2014-2024 dbsqp.com