真正根据utf8编码的规律来进行截取的字符的函数,utf8版sub_str
2012-10-23 00:23
441 查看
真正根据utf8编码的规律来进行截取的字符的函数,utf8版sub_str 支持1~6个字节的字符的截取,而非只针对中文,比网上的全。
测试数据::
<?php
$str = 'dfjdjf测13f试65&2数据fdj(1就mfe&……就';
var_dump( utf8_substr( $str , 22 , 12 ) ); echo ' <br /> ';
var_dump( utf8_substr( $str , 22 , -6 ) ); echo ' <br /> ';
var_dump( utf8_substr( $str , 9 , 12 ) ); echo ' <br /> ';
var_dump( utf8_substr( $str , 19 , 12 ) ); echo ' <br /> ';
var_dump( utf8_substr( $str , 28 , -6 ) ); echo ' <br /> ';
显示结果::(截取无乱码, 欢迎大家测试, 提交bug)
string(12) "据fdj"
string(26) "据fdj(1就mfe&…"
string(13) "13f试65&2数"
string(12) "数据fd"
string(20) "dj(1就mfe&…"
/* * 功能: 作用跟substr一样,除了它不会造成乱码 * 参数: * 返回: */ function utf8_substr( $str , $start , $length=null ){ // 先正常截取一遍. $res = substr( $str , $start , $length ); $strlen = strlen( $str ); /* 接着判断头尾各6字节是否完整(不残缺) */ // 如果参数start是正数 if ( $start >= 0 ){ // 往前再截取大约6字节 $next_start = $start + $length; // 初始位置 $next_len = $next_start + 6 <= $strlen ? 6 : $strlen - $next_start; $next_segm = substr( $str , $next_start , $next_len ); // 如果第1字节就不是 完整字符的首字节, 再往后截取大约6字节 $prev_start = $start - 6 > 0 ? $start - 6 : 0; $prev_segm = substr( $str , $prev_start , $start - $prev_start ); } // start是负数 else{ // 往前再截取大约6字节 $next_start = $strlen + $start + $length; // 初始位置 $next_len = $next_start + 6 <= $strlen ? 6 : $strlen - $next_start; $next_segm = substr( $str , $next_start , $next_len ); // 如果第1字节就不是 完整字符的首字节, 再往后截取大约6字节. $start = $strlen + $start; $prev_start = $start - 6 > 0 ? $start - 6 : 0; $prev_segm = substr( $str , $prev_start , $start - $prev_start ); } // 判断前6字节是否符合utf8规则 if ( preg_match( '@^([\x80-\xBF]{0,5})[\xC0-\xFD]?@' , $next_segm , $bytes ) ){ if ( !empty( $bytes[1] ) ){ $bytes = $bytes[1]; $res .= $bytes; } } // 判断后6字节是否符合utf8规则 $ord0 = ord( $res[0] ); if ( 128 <= $ord0 && 191 >= $ord0 ){ // 往后截取 , 并加在res的前面. if ( preg_match( '@[\xC0-\xFD][\x80-\xBF]{0,5}$@' , $prev_segm , $bytes ) ){ if ( !empty( $bytes[0] ) ){ $bytes = $bytes[0]; $res = $bytes . $res; } } } return $res; }
测试数据::
<?php
$str = 'dfjdjf测13f试65&2数据fdj(1就mfe&……就';
var_dump( utf8_substr( $str , 22 , 12 ) ); echo ' <br /> ';
var_dump( utf8_substr( $str , 22 , -6 ) ); echo ' <br /> ';
var_dump( utf8_substr( $str , 9 , 12 ) ); echo ' <br /> ';
var_dump( utf8_substr( $str , 19 , 12 ) ); echo ' <br /> ';
var_dump( utf8_substr( $str , 28 , -6 ) ); echo ' <br /> ';
显示结果::(截取无乱码, 欢迎大家测试, 提交bug)
string(12) "据fdj"
string(26) "据fdj(1就mfe&…"
string(13) "13f试65&2数"
string(12) "数据fd"
string(20) "dj(1就mfe&…"
相关文章推荐
- 真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
- 真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
- DELPHI的字符截取函数LEFTSTR, MIDSTR, RIGHTSTR的介绍以及字符串拆分
- [转载 php]php截取utf8编码的中文函数
- 编写一个函数 int count_chars(char const *str,char const *chars) 函数应该在第一个参数中进行查找, 并返回匹配第二个参数所包含的字符的数量。
- [转载 php]php截取utf8编码的中文函数
- delphi 字符截取函数LeftStr/MidStr/RightStr以及Copy的使用
- asp 实现对SQL注入危险字符进行重编码处理的函数
- str 函数主要用于返回与指定数值表达式对应的字符,截取小数位数
- 根据文本最大字符数进行字符串截取
- SQL REGEXP_SUBSTR函数,可以在sql中根据分割字符进行截取
- asp 实现对SQL注入危险字符进行重编码处理的函数
- (转)JavaScript escape() 函数(该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / 。其他所有的字符都会被转义序列替换。)
- NSUrl非英文字符进行UTF8编码
- 生成二维码 加密解密类 TABLE转换成实体、TABLE转换成实体集合(可转换成对象和值类型) COOKIE帮助类 数据类型转换 截取字符串 根据IP获取地点 生成随机字符 UNIX时间转换为DATETIME\DATETIME转换为UNIXTIME 是否包含中文 生成秘钥方式之一 计算某一年 某一周 的起始时间和结束时间
- phpcms 字符截取str_cut的使用
- php各种编码集详解和以及在什么情况下进行使用 发布:mdxy-dxy 字体:[增加 减小] 类型:转载 字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。 字符集是多个字符的集
- javac编译错误: 编码UTF8/GBK的不可映射字符
- 《oracle每日一练》oracle截取字符的函数
- 根据unicode编码过滤字符串中的字符