PHP自带的函数如strlen()、mb_strlen()都是通过计算字符串所占字节数来统计字符串长度的,一个英文字符占1字节。例:

$enStr = 'Hello,China!';
echo strlen($enStr); // 输出:12

而中文则不然,做中文网站一般会选择两种编码:gbk/gb2312或是utf-8。utf-8能兼容更多的字符,所以受到很多站长的喜爱。gbk与utf-8对中文的编码不同,导致中文在gbk与utf-8编码下所占字节也有差异。

gbk编码下每个中文字符所占字节为2,例:

$zhStr = '您好,中国!';
echo strlen($zhStr); // 输出:12

utf-8编码下每个中文字符所占字节为3,例:

$zhStr = '您好,中国!';
echo strlen($zhStr); // 输出:18

  1. /**
  2. *
  3. * 中英混合字符串长度判断
  4. * @param unknown_type $str
  5. * @param unknown_type $charset
  6. */
  7. function strLength($str, $charset = 'utf-8') {
  8. if ($charset == 'utf-8')
  9. $str = iconv ( 'utf-8', 'gb2312', $str );
  10. $num = strlen ( $str );
  11. $cnNum = 0;
  12. for($i = 0; $i < $num; $i ++) {
  13. if (ord ( substr ( $str, $i + 1, 1 ) ) > 127) {
  14. $cnNum ++;
  15. $i ++;
  16. }
  17. }
  18. $enNum = $num - ($cnNum * 2);
  19. $number = ($enNum / 2) + $cnNum;
  20. return ceil ( $number );
  21. }
  1. /**
  2. *
  3. * 中英混合的字符串截取
  4. * @param unknown_type $sourcestr
  5. * @param unknown_type $cutlength
  6. */
  7. function cut_str($sourcestr, $cutlength) {
  8. $returnstr = '';
  9. $i = 0;
  10. $n = 0;
  11. $str_length = strlen ( $sourcestr ); //字符串的字节数
  12. while ( ($n < $cutlength) and ($i <= $str_length) ) {
  13. $temp_str = substr ( $sourcestr, $i, 1 );
  14. $ascnum = Ord ( $temp_str ); //得到字符串中第$i位字符的ascii码
  15. if ($ascnum >= 224) //如果ASCII位高与224,
  16. {
  17. $returnstr = $returnstr . substr ( $sourcestr, $i, 3 ); //根据UTF-8编码规范,将3个连续的字符计为单个字符
  18. $i = $i + 3; //实际Byte计为3
  19. $n ++; //字串长度计1
  20. } elseif ($ascnum >= 192) //如果ASCII位高与192,
  21. {
  22. $returnstr = $returnstr . substr ( $sourcestr, $i, 2 ); //根据UTF-8编码规范,将2个连续的字符计为单个字符
  23. $i = $i + 2; //实际Byte计为2
  24. $n ++; //字串长度计1
  25. } elseif ($ascnum >= 65 && $ascnum <= 90) //如果是大写字母,
  26. {
  27. $returnstr = $returnstr . substr ( $sourcestr, $i, 1 );
  28. $i = $i + 1; //实际的Byte数仍计1个
  29. $n ++; //但考虑整体美观,大写字母计成一个高位字符
  30. } else //其他情况下,包括小写字母和半角标点符号,
  31. {
  32. $returnstr = $returnstr . substr ( $sourcestr, $i, 1 );
  33. $i = $i + 1; //实际的Byte数计1个
  34. $n = $n + 0.5; //小写字母和半角标点等与半个高位字符宽...
  35. }
  36. }
  37. if ($str_length > $cutlength) {
  38. $returnstr = $returnstr . "..."; //超过长度时在尾处加上省略号
  39. }
  40. return $returnstr;
  41. }

附加:

  1. // 中文字符串截取
  2. function msubstr($str, $start = 0, $length, $charset = "utf-8", $suffix = true)
  3. {
  4. switch ($charset)
  5. {
  6. case 'utf-8':
  7. $char_len = 3;
  8. break;
  9. case 'UTF8':
  10. $char_len = 3;
  11. break;
  12. default:
  13. $char_len = 2;
  14. }
  15. // 小于指定长度,直接返回
  16. if ( strlen($str) <= ($length * $char_len) )
  17. {
  18. return $str;
  19. }
  20. if ( function_exists("mb_substr") )
  21. {
  22. $slice = mb_substr($str, $start, $length, $charset);
  23. }
  24. else if ( function_exists('iconv_substr') )
  25. {
  26. $slice = iconv_substr($str, $start, $length, $charset);
  27. }
  28. else
  29. {
  30. $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
  31. $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
  32. $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
  33. $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
  34. preg_match_all($re[$charset], $str, $match);
  35. $slice = join("", array_slice($match[0], $start, $length));
  36. }
  37. if ( $suffix )
  38. {
  39. return $slice . "…";
  40. }
  41. return $slice;
  42. }

PHP针对中英文混合字符串长度判断及截取方法的更多相关文章

  1. PHP获取中英文混合字符串长度及截取

    1.字符串长度 PHP获取中英文混合字符串长度的实现代码如下,1中文=1位,2英文=1位,可自行修改 /** * PHP获取字符串中英文混合长度 * @param $str string 字符串 *  ...

  2. CSS截取中英文混合字符串长度

    <!doctype html> <html> <head> <meta http-equiv="content-type" content ...

  3. PHP中获取中英文混合字符串长度[主要是指个数,而不是字符串长度](转)

    今晚在写框架的表单验证类时,需要判断某个字符串长度是否在指定区间内,很自然地,想到了PHP中的strlen函数. $str = 'Hello world!'; echo strlen($str);   ...

  4. PHP 获取中英文混合字符串长度

    通常情况下要想掌握一个字符串变量的长度[一般掌握其字数],自然想到 strlen |--   $str = 'string'; echo strlen($str); //6 .csharpcode, ...

  5. php 中英文混合字符串长度计算

    (strlen($string) + mb_strlen($string,'UTF8')) / 2;tw 这样计算的

  6. js 计算中英文混合字符串长度

    转载请注明来源:https://www.cnblogs.com/hookjc/ function isChinese(str) {    var lst = /[u00-uFF]/;          ...

  7. C#与JS实现 获取指定字节长度 中英文混合字符串 的方法

    平时在作数据库插入操作时,如果用 INSERT 语句向一个varchar型字段插入内容时,有时会因为插入的内容长度超出规定的长度而报错. 尤其是插入中英文混合字符串时,SQL Server中一般中文要 ...

  8. 用C#截取指定长度的中英文混合字符串

    很早以前写过一篇文章(用C#截取指定长度的中英文混合字符串),但是对性能没有测试,有人说我写的这个方法性能有问题,后来想,可能真会有BT之需求要求传入一个几万K甚至几M体积的字符串进来,那将会影响正则 ...

  9. c#的中英文混合字符串截取指定长度,startidx从0开始

    //c#的中英文混合字符串截取指定长度,startidx从0开始 by gisoracle@126.com public string getStrLenB(string str, int start ...

随机推荐

  1. Deploying JAR Package & JSP Page in EBS R12.2.4 WLS

    https://pan.baidu.com/s/1OomyeLdbGWxTtCKVcweo0w # Uninstall JAR JSP QRCODE 1.# 查找QRCODE相关文件位置 [root@ ...

  2. 用户人品预测大赛--就是gan队--竞赛分享

     用户人品预测大赛--就是gan队--竞赛分享  DataCastle运营 发表于 2016-3-24 14:14:05      1194  1  0 答辩PPT

  3. Atlas+Keepalived系列一:安装Atlas:

    1:下载Atlas https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm 2:安装A ...

  4. linux/unix命令参考

  5. EasyUI 的 combotree 加载数据后折叠起来,并且只允许单击子节点的写法

    $(source).combotree({ url: '', width: kuan, valueField: 'id', textField: 'text', onlyLeafCheck: true ...

  6. 12C -- DDL日志

    DDL日志和alert日志有相似的格式和行为.但是只包含DDL语句日志.oracle只是为数据库组件提供DDL日志,且需要将参数enable_ddl_logging设置为true. 在DDL日志中,每 ...

  7. windows环境telnet发送命令

    telnet *.*.*.* port ,然后crtl+]进入命令模式,使用send发送消息,如:send hello,murphy 常用命令: open : 使用 openhostname 可以建立 ...

  8. Bash 中的特殊字符大全【转】

    Linux下无论如何都是要用到shell命令的,在Shell的实际使用中,有编程经验的很容易上手,但稍微有难度的是shell里面的那些个符号,各种特殊的符号在我们编写Shell脚本的时候如果能够用的好 ...

  9. Linux给普通用户增加ssh权限

    //1,创建用户 useradd name //2,修改密码 passwd name //3,修改ssh配置文件,在最后一行添加AllowUsers name vi /etc/ssh/sshd_con ...

  10. 【Linux】深入理解Linux中内存管理

    主题:Linux内存管理中的分段和分页技术 回顾一下历史,在早期的计算机中,程序是直接运行在物理内存上的.换句话说,就是程序在运行的过程中访问的都是物理地址. 如果这个系统只运行一个程序,那么只要这个 ...