2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > php 中文字 完善解决截取中文汉字不乱码-PHP字符串函数(支持utf8 GBK GB2312)

php 中文字 完善解决截取中文汉字不乱码-PHP字符串函数(支持utf8 GBK GB2312)

时间:2023-04-01 18:04:36

相关推荐

php 中文字 完善解决截取中文汉字不乱码-PHP字符串函数(支持utf8 GBK GB2312)

我们主要对utf8、GBK、GB2312的截取中文字符串进行讲解,完美解决截取中文汉字不乱码-PHP字符串函数:

1、截取GB2312以及GBK编码的字符串

函数功能:截取GB2312以及GBK编码的字符串,从第一个字符开始截取,2个长度代表一个汉字

$str————截取源字符串

$len————截取长度(2代表一个汉字)

PS:该函数不能用于utf8编码字符串,会出现乱码

function splitStr($str,$len)

{

if($len<=0)

{

return false;

}

else

{

$sLen=strlen($str);

if($len>=$sLen)

return $str;

else

{

for($i=0;$i

{

if(ord(substr($str,$i,1))>0xa0)

$i++;

}

if($i>=$len)

return substr($str,0,$len);

elseif(ord(substr($str,$i,1))>0xa0)

return substr($str,0,$len-1);

else

return substr($str,0,$len);

}

}

}

2、截取GB2312以及GBK编码的字符串

函数功能:截取GB2312以及GBK编码的字符串,可以设置截取位置和长度,2个长度代表一个汉字

$str————截取源字符串

$start———-起始位置,不能为空,从1算起

$len————截取长度(2代表一个汉字),如果为空则截取到字符串末尾

PS:该函数不能用于utf8编码字符串,会出现乱码

function substr_for_gb2312($str,$start,$len=null)

{

$totlelength = strlen($str);

//特例情况

if ($len == null) $len = $totlelength;

if ($len ==0) return “”;

if ($len >= $totlelength && $start == 0 ) return $str;

if ($start > $totlelength) return “”;

//分析$start

if ($start < 0 ) //$start<0时,转化为$start>0时的定位.

{

if ( abs($start) >= $totlelength )

$start = 0;

else

$start = $totlelength – abs($start);

}

//确定起始位置,当起始位拆分某汉字时,返回值包含此汉字.

if ($start > 0)

{

$i = $start-1;

$flag = -1;

while ($i >= 0)

{

if ( ord(substr($str,$i,1)) > 160)

{

$flag = -1*$flag;

}

else break;

$i–;

}

if($flag==1)

{

$start = $start – 1;

$len++; //保证不位移.

}

}

$str = substr($str,$start);//截除字符串$str的$start位前的字符

$totlelength = strlen($str);

//确定结束位置,当结束位拆分某汉字时,返回值不包含此汉字.

if ($len<0) $len = $totlelength – abs($len);

if ($len <= 0) return “”;

$i=min($len,$totlelength);

$i–;

$flag = -1;

while ($i >= 0)

{

if (ord(substr($str,$i,1))>160)

{

$flag=-1*$flag;

}

else break;

$i–;

}

if($flag == 1) $len=$len-1;

$subit=substr($str,0,$len);

return $subit;

}

3、截取utf8或GB2312或者GBK编码的字符串

函数功能:截取utf8或GB2312或者GBK编码的字符串,从第一个字符开始截取,1个长度代表一个汉字

$sourcestr————截取源字符串

$cutlength————截取长度(字数)

PS:这个函数很万能,但是相对前两个耗资源一些

function substr_for_utf8($sourcestr,$cutlength)

{

$returnstr=”;

$i=0;

$n=0;

$str_length=strlen($sourcestr); //字符串的字节数

while (($n

{

$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;

}

最后,你可以简单写个程序调用一下试试,例如:

$a=”我们都会写Hello world!这个最简单的程序。”;

echo $a.”

”;

$a=substr_for_utf8($a,4);

echo $a.”

”;

?>

怎么样?不错吧,那就快来试试吧 O(∩_∩)O哈哈~

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。