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

我们知道有时候使用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);
?>

时间: 2024-09-13 09:28:48

解析使用substr截取UTF-8中文字符串出现乱码的问题_php技巧的相关文章

php截取中文字符串不乱码的方法_php实例

GBK编码截取示例 复制代码 代码如下: $str = '我是谁';  //gbk编码的字符串echo mb_substr($str, 0, 1, 'gbk'); //输出 我 mb_substr方法比substr多一个参数,用来指定字符串编码. utf-8编码截取示例 [code]$str = '我abc是谁';  //utf-8编码的字符串echo mb_substr($str, 0, 2, 'utf-8'); //输出 我a[/code 中英混合也完全没有问题. 友情提示 使用的时候要注意

解析微信接口返回的json 中文昵称为乱码 怎么回事

问题描述 解析微信接口返回的json 中文昵称为乱码 怎么回事 package Htttp; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import org.codehaus.jettison.json.JSONException; impo

php实现中文字符截取防乱码方法汇总_php技巧

大家在自己的程序中相信都会经常用到截取字符串吧,但是往往遇到截取中文字符串的时候会遇到乱码的问题.很是让人头疼,接下来介绍两种方法防止截取中文字符串的时候出现乱码的问题. 首先第一种,自己写好的一个函数方便使用 利用这个函数截取就不会出现乱码了. /** * 支持中文字符串截取 */ function msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true){ switch($charset){ case 'utf

中文字符串显示乱码-java前端jquery接接收中文字符串乱码问题

问题描述 java前端jquery接接收中文字符串乱码问题 服务端:@RequestMapping(value="/detail/modSelect", method = {RequestMethod.POST}) public @ResponseBody String mod(@RequestBody String reqParam){ //修改请求处理 System.out.println("修改请求发送到此"); System.out.println(reqP

获取中文字符串的实际长度代码_javascript技巧

JS中默认中文字符长度和其它字符长度计算方法是一样的,但某些情况下我们需要获取中文字符串的实际长度,代码如下: 复制代码 代码如下: function strLength(str) { var realLength = 0, len = str.length, charCode = -1; for (var i = 0; i < len; i++) { charCode = str.charCodeAt(i); if (charCode >= 0 && charCode <

c/c++用Unicode和UTF8处理中文字符串解决乱码

1. 描述 在windows上做系统编程,少不了会遇到处理中文字符串的问题.而大多时候中文汉字都是以多字节编码的方式展现的.为了实现更好的兼容性或一些特殊的需求,(比如在网页上显示.)常需要将其转换成unicode或者utf8的格式. 2. 代码示例 2.1 中文字符串转Unicode /*************************************************************************int CN2Unicode(char *input,wchar

php截取中文字符串不乱码的方法

 利用php内置方法mb_substr截取中文不乱码,使用起来非常简单,大家参考使用吧  GBK编码截取示例   代码如下: $str = '我是谁';  //gbk编码的字符串 echo mb_substr($str, 0, 1, 'gbk'); //输出 我     mb_substr方法比substr多一个参数,用来指定字符串编码.   utf-8编码截取示例   [code] $str = '我abc是谁';  //utf-8编码的字符串 echo mb_substr($str, 0,

PHP中文字符串截断无乱码解决方法_php技巧

一个比较好用的字符串截取函数: function substring($str, $start, $length){ //比较好用字符串截取函数 $len = $length; if($length < 0){ $str = strrev($str); $len = -$length; } $len= ($len < strlen($str)) ? $len : strlen($str); $tmpstr = ""; for ($i= $start; $i < $le

根据中文裁减字符串函数的php代码_php技巧

复制代码 代码如下: define(CHARSET, 'UTF-8'); // 系统默认编码 /** * 根据中文裁减字符串 * @param $string - 字符串 * @param $length - 长度 * @param $doc - 缩略后缀 * @return 返回带省略号被裁减好的字符串 */ function cutstr( $string, $length, $dot = '...' ) { if ( strlen( $string ) <= $length ) { ret