没事写了两个函数,php中gbk和utf-8中文无乱码截取

来源:互联网 发布:指绘软件meidbang 编辑:程序博客网 时间:2024/05/22 06:42

一,gbk/gb2312中文截取

在gbk/gb2312编码中一个中文占两个字节,一个ascii字符占一个字节,函数如下:

//gbk,gb2312字符串截取函数function gbk_substr($str,$len){if($len<=0)return '';$chars=0;$bytes=0;$str_bytes=strlen($str);for($i=0;$i<$str_bytes && $chars<$len;$chars++){if(ord($str[$i])>127){//当字符的码值大于127时为中文,此时应该截取两个字节$bytes += 2;$i += 2;}else{$bytes += 1;$i += 1;}}return substr($str,0,$bytes);}



二,utf-8中文截取

在utf-8编码中,基本上包含了世界各国的所有文字,各种字符占1-6个字节不等,比如一个中文通常占3个字节

//utf-8字符串截取函数function utf8_substr($str,$len){if($len<=0)return '';$chars=0;$bytes=0;$str_bytes=strlen($str);for($i=0;$i<$str_bytes && $chars<$len;$chars++){$bin_str=decbin(ord($str[$i]));if(strlen($bin_str)<8){           $bytes += 1;   $i += 1;        }else if(($bin_str & "11100000")=="11000000"){           $bytes += 2;   $i += 2;        }else if(($bin_str & "11110000")=="11100000"){           $bytes += 3;   $i += 3;        }else if(($bin_str & '11111000')=='11110000'){            $bytes += 4;   $i += 4;        }else if(($bin_str & "11111100")=="11111000"){            $bytes += 5;   $i += 5;        }else if(($bin_str & "11111110")=="11111100"){            $bytes += 6;   $i += 6;        }}return substr($str,0,$bytes);}



原创粉丝点击