PHP中文无乱码截取
正在上传文件反正无聊 就把php无乱码截取写出来吧`
参数说明
gbk 字符编码中,存储中文字符要2个字节
uft-8 字符编码中,存储中文字符要3个字节
0xa0 半个汉字
ord()— 返回字符的 ASCII 码值
chr() — 返回指定的字符
在网上我也看到一些截取中文的函数 但是我认为他们是有缺陷的 如不能区别utf-8 gbk的字符集 中文 于是我自己写了一个
但是我却发现我写的函数其实是用mb系列函数 ,我也是廋少不了
header("content-type:text/html; charset = gbk"); function chinesesubstr($str,$star,$len,$char_set='uft8'){ $tmpstr = null; $char_set=='gbk'?$char_set=2:$char_set=3; //根据不同的字符集 来截取不同的长度 $strlen = $star+$len; for( $i=0;$i<$strlen;$i++ ){ if(ord(substr($str,$i,1))>0xa0){ $tmpstr .= substr($str,$i,$char_set); $i++; }else{ $tmpstr .= substr($str,$i,1); } } return $tmpstr; } //中文(中文特殊符号->有一些事不区分中英的#%*等):3 数字:1 字母(特殊符号):1 echo chinesesubstr('玩儿qqq额外人听闻',0,5,'gbk');
所以还是老老实实的写一个mb系列的函数吧
function chinesesubstr($str,$star=0,$len,$encoding ='utf8'){ $strlen = mb_strlen($str, $encoding); if($strlen < $len){ return $str; }else{ $re_turn = mb_substr($str,$star,$len,$encoding).chr(0).'...'; return $re_turn; } } $str = "这个新闻或是文章的标题很长,需要只显示前面一些字,后面用...来代替"; echo chinesesubstr($str,0,5);
知识点终结
当汉字被截断时,根据编码规则他总是要把后边的其他字符拉过来一起作为汉字解释,
这就是出现乱码的原因。而值为0x81到0xff与0x00组合始终都显示为“空” 根据这一特点,
在substr的结果后面补上一个chr(0),就可以防止出现乱码了
chr(0)相关知识:
null是什么都没有,而chr(0)的值是0。表示成16进制是0x00,表示成二进制是00000000
虽然chr(0)不会显示出什么,但是他是一个字符。