为了支持多语言,数据库里的字符串可能保存为UTF-8编码,在网站开发中可能需要用php截取字符串的一部分。为了避免出现乱码现象,编写如下的UTF-8字符串截取函数 关于utf-8的原理请看 UTF-8 FAQ UTF-8编码的字符可能由1~3个字节组成, 具体数目可以由第一个字节判断出来。(理论上可能更长,但这里假设不超过3个字节) 第一个字节大于224的,它与它之后的2个字节一起组成一个UTF-8字符第一个字节大于192小于224的,它与它之后的1个字节组成一个UTF-8字符否则第一个字节本身就是一个英文字符(包括数字和一小部分标点符号)。 以前为某网站设计的代码(也是现在用在首页的长度截取的函数)
PHP 代码:复制
//$sourcestr 是要处理的字符串
//$cutlength 为截取的长度(即字数)
function cutstr($sourcestr,$cutlength) {
$returnstr = \'\';
$i = 0;
$n = 0;
$str_length = strlen($sourcestr);//字符串的字节数
while (($n < $cutlength) and ($i <= $str_length)) {
$temp_str = substr($sourcestr,$i,1);
$ascnum = Ord($temp_str);//得到字符串中第$i位字符的ascii码
if ($ascnum >= 224) {//如果ASCII位高与224
$returnstr = $returnstr.substr($sourcestr,$i,3); //根据UTF-8编码规范,将3个连续的字符计为单个字符
$i = $i + 3; //实际Byte计为3
$n++; //字串长度计1
}
elseif ($ascnum >= 192) {//如果ASCII位高与192
$returnstr = $returnstr.substr($sourcestr,$i,2); //根据UTF-8编码规范,将2个连续的字符计为单个字符
$i = $i + 2; //实际Byte计为2 $n++; //字串长度计1
}
elseif ($ascnum >= 65 && $ascnum <= 90) {//如果是大写字母
$returnstr = $returnstr.substr($sourcestr,$i,1);
$i = $i + 1; //实际的Byte数仍计1个
$n++; //但考虑整体美观,大写字母计成一个高位字符
}
else {//其他情况下,包括小写字母和半角标点符号,
$returnstr = $returnstr.substr($sourcestr,$i,1);
$i = $i + 1; //实际的Byte数计1个
$n = $n + 0.5; //小写字母和半角标点等与半个高位字符宽...
}
}
if ($str_length > $cutlength) {
$returnstr = $returnstr . \"...\";//超过长度时在尾处加上省略号
}
return $returnstr;
}