i漂泊

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3812|回复: 0

mb_substr增强,解决中文字符串乱码问题

[复制链接]
TA的礼物信息
  • 收到:0
  • 送出:2
发表于 2014-6-17 08:47:52 | 显示全部楼层 |阅读模式
解决使用mb_substr截取字符串时中文乱码的问题

注:mb_substr 可以用来截取纯中文字符串,但是当中文字符串中含有数字或者英文字符或者中文状态下一个标点符号时会出现截取时中文乱码问题,因此这个函数就是用来解决这个问题的。
  1. /**
  2. * 中英文字符截取函数,要求汉字字符编码必须为utf-8
  3. * $offset  跳过的字符个数
  4. * $length        截取的字符数个数
  5. */
  6. function zh_substr($str, $offset, $length = -1) {
  7.         $ret = '';
  8.         $bytelen = mb_strlen($str); //字符串的字节数
  9.         $start = 0;
  10.         $end = 0;
  11.         $nums = 0;
  12.         $count = 1;
  13.         for ( $i = 0; $i < $bytelen; $i++ ) {
  14.                 if ( $nums == $offset ) {
  15.                         $start = $i;
  16.                         break;
  17.                 }
  18.                 if ( ord($str{$i}) > 0x80 || $count > 1 ) { //汉字
  19.                         if ( $count % 3 === 0 ) { //统计出一个汉字
  20.                                 $nums += 1;
  21.                                 $count = 1;
  22.                         } else {
  23.                                 $count += 1;       
  24.                         }
  25.                         continue;
  26.                 }
  27.                 $nums += 1; //统计出一个英文
  28.         }
  29.         $nums = 0;
  30.         $count = 1;
  31.         for ( $i = $start; $i < $bytelen; $i++ ) {
  32.                 if ( $nums == $length ) {
  33.                         break;
  34.                 }
  35.                 if ( ord($str{$i}) > 0x80 || $count > 1 ) { //汉字
  36.                         if ( $count % 3 === 0 ) { //统计出一个汉字
  37.                                 $nums += 1;
  38.                                 $count = 1;
  39.                                 $end += 3;
  40.                         } else {
  41.                                 $count += 1;       
  42.                         }
  43.                         continue;
  44.                 }
  45.                 $nums += 1; //统计出一个英文
  46.                 $end += 1;
  47.         }
  48.         $ret = mb_substr($str, $start, $end);
  49.         return $ret;
  50. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|IPiaoBo Inc. ( 渝ICP备17002826号 )

GMT+8, 2024-5-5 04:43 , Processed in 0.078773 second(s), 47 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表