1. /**
  2. *
  3. * 中英混合字符串长度判断
  4. * @param unknown_type $str
  5. * @param unknown_type $charset
  6. */
  7. function strLength($str, $charset = 'utf-8')
  8. {
  9. if ($charset == 'utf-8'){
  10. $str = iconv('utf-8', 'gb2312', $str);
  11. }
  12. $num = strlen($str);
  13. $cnNum = 0;
  14. for ($i = 0; $i < $num; $i++) {
  15. if (ord(substr($str, $i + 1, 1)) > 127) {
  16. $cnNum++;
  17. $i++;
  18. }
  19. }
  20. $enNum = $num - ($cnNum * 2);
  21. $number = ($enNum / 2) + $cnNum;
  22. return ceil($number);
  23. }
  24.  
  25. /**
  26. *
  27. * 中英混合的字符串截取
  28. * @param unknown_type $sourcestr
  29. * @param unknown_type $cutlength
  30. */
  31. function cut_str($sourcestr, $cutlength)
  32. {
  33. $returnstr = '';
  34. $i = 0;
  35. $n = 0;
  36. $str_length = strlen($sourcestr); //字符串的字节数
  37. while (($n < $cutlength) and ($i <= $str_length)) {
  38. $temp_str = substr($sourcestr, $i, 1);
  39. $ascnum = Ord($temp_str); //得到字符串中第$i位字符的ascii码
  40. if ($ascnum >= 224) //如果ASCII位高与224,
  41. {
  42. $returnstr = $returnstr . substr($sourcestr, $i, 3); //根据UTF-8编码规范,将3个连续的字符计为单个字符
  43. $i = $i + 3; //实际Byte计为3
  44. $n++; //字串长度计1
  45. } elseif ($ascnum >= 192) //如果ASCII位高与192,
  46. {
  47. $returnstr = $returnstr . substr($sourcestr, $i, 2); //根据UTF-8编码规范,将2个连续的字符计为单个字符
  48. $i = $i + 2; //实际Byte计为2
  49. $n++; //字串长度计1
  50. } elseif ($ascnum >= 65 && $ascnum <= 90) //如果是大写字母,
  51. {
  52. $returnstr = $returnstr . substr($sourcestr, $i, 1);
  53. $i = $i + 1; //实际的Byte数仍计1个
  54. $n++; //但考虑整体美观,大写字母计成一个高位字符
  55. } else //其他情况下,包括小写字母和半角标点符号,
  56. {
  57. $returnstr = $returnstr . substr($sourcestr, $i, 1);
  58. $i = $i + 1; //实际的Byte数计1个
  59. $n = $n + 0.5; //小写字母和半角标点等与半个高位字符宽...
  60. }
  61. }
  62. if ($str_length > $cutlength) {
  63. $returnstr = $returnstr . "..."; //超过长度时在尾处加上省略号
  64. }
  65. return $returnstr;
  66. }
  67.  
  68. /**
  69. * PHP实现中文字串截取无乱码的方法
  70. * @param $string
  71. * @param $start
  72. * @param $length
  73. * @return string
  74. */
  75. function GBsubstr($string, $start, $length)
  76. {
  77. if (strlen($string) > $length) {
  78. $str = null;
  79. $len = $start + $length;
  80. for ($i = $start; $i < $len; $i++) {
  81. if (ord(substr($string, $i, 1)) > 0xa0) {
  82. $str .= substr($string, $i, 2);
  83. $i++;
  84. } else {
  85. $str .= substr($string, $i, 1);
  86. }
  87. }
  88. return $str . '...';
  89. } else {
  90. return $string;
  91. }
  92. }
  93.  
  94. function substr_text($str, $start = 0, $length, $charset = "utf-8", $suffix = "")
  95. {
  96. if (function_exists("mb_substr")) {
  97. return mb_substr($str, $start, $length, $charset) . $suffix;
  98. } elseif (function_exists('iconv_substr')) {
  99. return iconv_substr($str, $start, $length, $charset) . $suffix;
  100. }
  101. $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
  102. $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
  103. $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
  104. $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
  105. preg_match_all($re[$charset], $str, $match);
  106. $slice = join("", array_slice($match[0], $start, $length));
  107. return $slice . $suffix;
  108. }

php字符串无乱码截取函数封装的更多相关文章

  1. php实现中文字符串无乱码截取

    在PHP开发中会经常用到字符串截取,有的时候字符串截取会出现乱码的情况,那么怎么解决这个问题呢,其实也很容易 首先我们要了解关于中英文占多少字节的问题. ASCII码:一个中文汉字占两个字节的空间. ...

  2. PHP中文无乱码截取

    正在上传文件反正无聊 就把php无乱码截取写出来吧` 参数说明 gbk    字符编码中,存储中文字符要2个字节 uft-8  字符编码中,存储中文字符要3个字节 0xa0  半个汉字 ord()—  ...

  3. php截取中文字符串无乱码的方法

    利用php内置方法mb_substr截取中文不乱码,使用起来非常简单 <?php $str = '我喜欢laravel or yii2'; echo mb_substr($str, 0, 1, ...

  4. js截取中英文字符串、标点符号无乱码示例解读

    <script> function subString(str, len, hasDot) { var newLength = 0; var newStr = ""; ...

  5. PHP截取中文无乱码函数——cutstr

    转载:http://blog.sina.com.cn/s/blog_694c144f010179wj.html 真正好用的PHP截取中文无乱码函数——cutstr (2012-07-09 11:17: ...

  6. PHP实现中文字符串截取无乱码

    在我们学习PHP知识的过程中,PHP截取字符串应该是一个非常常见的字符串基础操作了,想必大家都比较熟悉这方面知识点. 但是有些新手朋友们可能遇到过,当截取中英文字符串时出现乱码的情况,其实这个也是非常 ...

  7. php截取字符串,无乱码

    今天面试,有一道题,要求截取中文字符无乱码. 当时因为要赶去另一家去面试,没有仔细分析. 虽然现在供职的这家公司b2c项目正在用,因为当时赶项目,是网上拿来直接用的. 回来以后再重新整理了一下. 代码 ...

  8. php中文截取无乱码方法

    直接使用PHP函数substr截取中文字符可能会出现乱码,主要是substr可能硬生生的将一个中文字符“锯”成两半.解决办法: 1.使用mbstring扩展库的mb_substr截取就不会出现乱码了. ...

  9. PHP实现中文字串截取无乱码的方法

    直接使用PHP函数substr截取中文字符可能会出现乱码,主要是substr可能硬生生的将一个中文字符“锯”成两半.解决办法: 1.使用mbstring扩展库的mb_substr截取就不会出现乱码了. ...

随机推荐

  1. ojdbc.jar

    Oracle的jdbc驱动是ojdbc.jar 文件,那么mysql的jdbc驱动是什么呢? 匿名 | 浏览 689 次 发布于2015-06-07 02:06   最佳答案   MySQL的JDBC ...

  2. Node & Express: some tips

    1. 设置Express端口号: 在app.js中添加 app.set('port', process.env.PORT || 3000); 之后命令行中打入 PORT=1234 node app.j ...

  3. 开源的轻量级JSON存储Kinto介绍

    本文来源于我在InfoQ中文站翻译的文章,原文地址是:http://www.infoq.com/cn/news/2015/12/introducing-kinto Kinto是个提供了同步与分片功能的 ...

  4. [JavaEE] Implement a test for REST endpoint

    1. We have the BookEndpoint.java: package com.pluralsight.bookstore.rest; import com.pluralsight.boo ...

  5. Java入门 第二季第三章 继承

    这是我学习慕课网Java课程的笔记,原视频链接为:http://www.imooc.com/learn/124 3-1 Java 中的继承  ★ 概念:继承是类与类的一种关系,是一种 "is ...

  6. LeetCode 977. Squares of a Sorted Array (有序数组的平方)

    题目标签:Array 题目给了我们一组 从小到大的 integers,让我们平方数字 并且 也排序成 从小到达. 因为有负数在里面,平方后,负数在array的位置会变动. 可以设left 和 righ ...

  7. svn 运行clear up 失败的解决的方法

    SVN 的clear up命令失败的解决方法   1. 下载  sqlite3.exe  文件,放到d盘根文件夹. (能够到这里下载   http://download.csdn.net/detail ...

  8. eclipse和jdk版本对应问题

    日常开发中,32位eclipse要用32位jdk,64位则必须要用64位jdk,否则启动时就会报错,load jvm.dll失败,昨天又遇到了这个问题.更换对应的版本之后就好了.tomcat等应用也有 ...

  9. 编译android4.4 报错error: call to '__property_get_too_small_error' declared with attribute 的处理 (转载)

    转自:http://blog.csdn.net/syhost/article/details/14448899 完整的报错为: system/core/include/cutils/propertie ...

  10. redhat6 改 centos yum 源

    **redhat的yum在线更新是收费的,如果没有注册的话不能使用,如果要使用,需将redhat的yum卸载后,重启安装其他yum源,再配置其他源.** 本文包括配置本地源及第三方源.第三方源包括:网 ...