解析使用substr截取UTF-8中文字符串出现乱码的问题
发布网友
发布时间:2022-04-28 07:47
我来回答
共2个回答
懂视网
时间:2022-04-28 12:09
(推荐教程:php教程)
原因分析:
substr() 函数只针对英文字符,如果我们要分割中文字符,则需要使用 mb_substr()函数。
函数介绍:
mb_substr() 函数返回字符串的一部分。
语法:
mb_substr(string $str, int $start[,int $length = NULL[, string $encoding = mb_internal_encoding()]]):string
参数介绍:
str 必需。从该 string 中提取子字符串
start 必需。规定在字符串的何处开始
length 可选。规定要返回的字符串长度。默认是直到字符串的结尾
encoding 可选。字符编码。如果省略,则使用内部字符编码
返回值:
返回字符串的提取部分,如果失败则返回 FALSE,或者返回一个空字符串。
代码实现:
<?php
header("Content-Type: text/html; charset=utf-8");
$str="网站工作室欢迎您!";
echo mb_strlen($str,"UTF8")."<br>";
echo mb_substr($str,0,2,"UTF8")."<br>";
?>
热心网友
时间:2022-04-28 09:17
我们知道有时候使用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);
?>