utf8编码的字符串截取
2016-06-07 11:36
204 查看
/* * 功能: 作用跟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; }
相关文章推荐
- Alpha版总结会议
- mongodb_修改器($inc/$set/$unset/$push/$pop/upsert......)
- jq 获取当前屏幕高度
- Android 动画 - TranslateAnimation位移动画
- 成都几家游戏公司的面经(C++、图形学) ——第一天
- apache-activemq-5.14.0设置自启动和加入服务管理
- SharedPreferences封装类SPUtils
- Windows Server 2008配置Jmail发送邮件
- XenServer架构之HA概述
- Linux中文件与目录对应的硬链接与软链接方式总结
- VBA 使用Excel数据库:行转列
- leetcode 81. Search in Rotated Sorted Array II-旋转数组|二分查找
- Javascript之Date对象详解
- KEIL C51程序中如何嵌入汇编
- JQuery知识点链接
- 《人月神话》阅读笔记03
- 动态显示listview的数据,同步机制
- CocoaPods版本升级——本地CocoaPods更新
- java笔记3
- FTP主动模式和被动模式的区别