PHP字符串截取乱码问题解决!fun
2018-01-12 17:04
1081 查看
字符串截取是我们开发中用得最多的,但是中英文全半角符号混合的字符串很容易出现乱码,本方法适用UTF-8编码的所有字符串,切取方式为常用的substr字节方式,经过反复验证此方法杜绝了乱码产生,根据方法思路稍加改动可以用于其他编码,话不多说直接上function。
依赖以上方法扩展下,连续截取中英文全半角混合字符串:
/**
* 分行连续截取字符串
* @param $str 需要截取的字符串,UTF-8
* @param int $row 截取的行数
* @param int $number 每行截取的字数,中文长度
* @param bool $suffix 最后行是否添加‘...’后缀
* @return array 返回数组共$row个元素,下标1到$row
*/
function cn_row_substr($str,$row = 1,$number = 10,$suffix = true){
$result = array();
for ($r=1;$r<=$row;$r++){
$result[$r] = '';
}
$str = trim($str);
if(!$str) return $result;
$theStrlen = strlen($str);
//每行实际字节长度
$oneRowNum = $number * 3;
for($r=1;$r<=$row;$r++){
if($r == $row and $theStrlen > $r * $oneRowNum and $suffix){
$result[$r] = mg_cn_substr($str,$oneRowNum-6,($r-1)* $oneRowNum).'...';
}else{
$result[$r] = mg_cn_substr($str,$oneRowNum,($r-1)* $oneRowNum);
}
if($theStrlen < $r * $oneRowNum) break;
}
return $result;
}
/** * 按字节截取utf-8字符串 * 识别汉字全角符号,全角中文3个字节,半角英文1个字节 * @param $str 需要切取的字符串 * @param $len 截取长度[字节] * @param int $start 截取开始位置,默认0 * @return string */ function mg_cn_substr($str,$len,$start = 0){ $q_str = ''; $q_strlen = ($start + $len)>strlen($str) ? strlen($str) : ($start + $len); //如果start不为起始位置,若起始位置为乱码就按照UTF-8编码获取新start if($start and json_encode(substr($str,$start,1)) === false){ for($a=0;$a<3;$a++){ $new_start = $start + $a; $m_str = substr($str,$new_start,3); if(json_encode($m_str) !== false) { $start = $new_start; break; } } } //切取内容 for($i=$start;$i<$q_strlen;$i++){ //ord()函数取第一个字符的ASCII码,如果大于0xa0的话则是中文字符 if(ord(substr($str,$i,1))>0xa0){ $q_str .= substr($str,$i,3); $i+=2; }else{ $q_str .= substr($str,$i,1); } } return $q_str; }
依赖以上方法扩展下,连续截取中英文全半角混合字符串:
/**
* 分行连续截取字符串
* @param $str 需要截取的字符串,UTF-8
* @param int $row 截取的行数
* @param int $number 每行截取的字数,中文长度
* @param bool $suffix 最后行是否添加‘...’后缀
* @return array 返回数组共$row个元素,下标1到$row
*/
function cn_row_substr($str,$row = 1,$number = 10,$suffix = true){
$result = array();
for ($r=1;$r<=$row;$r++){
$result[$r] = '';
}
$str = trim($str);
if(!$str) return $result;
$theStrlen = strlen($str);
//每行实际字节长度
$oneRowNum = $number * 3;
for($r=1;$r<=$row;$r++){
if($r == $row and $theStrlen > $r * $oneRowNum and $suffix){
$result[$r] = mg_cn_substr($str,$oneRowNum-6,($r-1)* $oneRowNum).'...';
}else{
$result[$r] = mg_cn_substr($str,$oneRowNum,($r-1)* $oneRowNum);
}
if($theStrlen < $r * $oneRowNum) break;
}
return $result;
}
相关文章推荐
- 【PHP】解决 php 截取字符串中文乱码问题
- PHP字符串截取函数(解决中文乱码问题!支持UTF-8和GB2312)
- php截取字符串,解决乱码问题与html标签问题
- php解决中文字符串截取的乱码问题
- 解决php中截取字符串的中文乱码问题
- PHP使用mb_substr()解决中文字符串截取乱码问题
- php截取中文字符串解决乱码问题
- php中文字符串截取乱码问题解决
- PHP substr 截取字符串出现乱码问题解决方法[utf8与gb2312]
- php中文字符串截取乱码问题解决
- PHP解决截取字符串乱码问题
- PHP substr()截取字符串时,中文出现乱码的问题解决【转】
- PHP使用mb_substr()解决中文字符串截取乱码问题
- 关于PHP截取中文字符串乱码问题解决
- PHP substr 截取字符串出现乱码问题解决方法[utf8与gb2312]
- 解决php截取文字乱码问题
- php怎么处理截取字符串出现的乱码问题
- 解决PHP截取中文字符串问题
- php如何分割字符串?php mb_substr分割字条串,解决中文乱码问题,支持分割中文! (转)
- PHP截取中文字符串乱码问题(UTF8编码下)