PHP针对中英文混合字符串长度判断及截取方法
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
- /**
- *
- * 中英混合字符串长度判断
- * @param unknown_type $str
- * @param unknown_type $charset
- */
- function strLength($str, $charset = 'utf-8') {
- if ($charset == 'utf-8')
- $str = iconv ( 'utf-8', 'gb2312', $str );
- $num = strlen ( $str );
- $cnNum = 0;
- for($i = 0; $i < $num; $i ++) {
- if (ord ( substr ( $str, $i + 1, 1 ) ) > 127) {
- $cnNum ++;
- $i ++;
- }
- }
- $enNum = $num - ($cnNum * 2);
- $number = ($enNum / 2) + $cnNum;
- return ceil ( $number );
- }
- /**
- *
- * 中英混合的字符串截取
- * @param unknown_type $sourcestr
- * @param unknown_type $cutlength
- */
- function cut_str($sourcestr, $cutlength) {
- $returnstr = '';
- $i = 0;
- $n = 0;
- $str_length = strlen ( $sourcestr ); //字符串的字节数
- while ( ($n < $cutlength) and ($i <= $str_length) ) {
- $temp_str = substr ( $sourcestr, $i, 1 );
- $ascnum = Ord ( $temp_str ); //得到字符串中第$i位字符的ascii码
- if ($ascnum >= 224) //如果ASCII位高与224,
- {
- $returnstr = $returnstr . substr ( $sourcestr, $i, 3 ); //根据UTF-8编码规范,将3个连续的字符计为单个字符
- $i = $i + 3; //实际Byte计为3
- $n ++; //字串长度计1
- } elseif ($ascnum >= 192) //如果ASCII位高与192,
- {
- $returnstr = $returnstr . substr ( $sourcestr, $i, 2 ); //根据UTF-8编码规范,将2个连续的字符计为单个字符
- $i = $i + 2; //实际Byte计为2
- $n ++; //字串长度计1
- } elseif ($ascnum >= 65 && $ascnum <= 90) //如果是大写字母,
- {
- $returnstr = $returnstr . substr ( $sourcestr, $i, 1 );
- $i = $i + 1; //实际的Byte数仍计1个
- $n ++; //但考虑整体美观,大写字母计成一个高位字符
- } else //其他情况下,包括小写字母和半角标点符号,
- {
- $returnstr = $returnstr . substr ( $sourcestr, $i, 1 );
- $i = $i + 1; //实际的Byte数计1个
- $n = $n + 0.5; //小写字母和半角标点等与半个高位字符宽...
- }
- }
- if ($str_length > $cutlength) {
- $returnstr = $returnstr . "..."; //超过长度时在尾处加上省略号
- }
- return $returnstr;
- }
附加:
- // 中文字符串截取
- function msubstr($str, $start = 0, $length, $charset = "utf-8", $suffix = true)
- {
- switch ($charset)
- {
- case 'utf-8':
- $char_len = 3;
- break;
- case 'UTF8':
- $char_len = 3;
- break;
- default:
- $char_len = 2;
- }
- // 小于指定长度,直接返回
- if ( strlen($str) <= ($length * $char_len) )
- {
- return $str;
- }
- if ( function_exists("mb_substr") )
- {
- $slice = mb_substr($str, $start, $length, $charset);
- }
- else if ( function_exists('iconv_substr') )
- {
- $slice = iconv_substr($str, $start, $length, $charset);
- }
- else
- {
- $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
- $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
- $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
- $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
- preg_match_all($re[$charset], $str, $match);
- $slice = join("", array_slice($match[0], $start, $length));
- }
- if ( $suffix )
- {
- return $slice . "…";
- }
- return $slice;
- }
PHP针对中英文混合字符串长度判断及截取方法的更多相关文章
- PHP获取中英文混合字符串长度及截取
1.字符串长度 PHP获取中英文混合字符串长度的实现代码如下,1中文=1位,2英文=1位,可自行修改 /** * PHP获取字符串中英文混合长度 * @param $str string 字符串 * ...
- CSS截取中英文混合字符串长度
<!doctype html> <html> <head> <meta http-equiv="content-type" content ...
- PHP中获取中英文混合字符串长度[主要是指个数,而不是字符串长度](转)
今晚在写框架的表单验证类时,需要判断某个字符串长度是否在指定区间内,很自然地,想到了PHP中的strlen函数. $str = 'Hello world!'; echo strlen($str); ...
- PHP 获取中英文混合字符串长度
通常情况下要想掌握一个字符串变量的长度[一般掌握其字数],自然想到 strlen |-- $str = 'string'; echo strlen($str); //6 .csharpcode, ...
- php 中英文混合字符串长度计算
(strlen($string) + mb_strlen($string,'UTF8')) / 2;tw 这样计算的
- js 计算中英文混合字符串长度
转载请注明来源:https://www.cnblogs.com/hookjc/ function isChinese(str) { var lst = /[u00-uFF]/; ...
- C#与JS实现 获取指定字节长度 中英文混合字符串 的方法
平时在作数据库插入操作时,如果用 INSERT 语句向一个varchar型字段插入内容时,有时会因为插入的内容长度超出规定的长度而报错. 尤其是插入中英文混合字符串时,SQL Server中一般中文要 ...
- 用C#截取指定长度的中英文混合字符串
很早以前写过一篇文章(用C#截取指定长度的中英文混合字符串),但是对性能没有测试,有人说我写的这个方法性能有问题,后来想,可能真会有BT之需求要求传入一个几万K甚至几M体积的字符串进来,那将会影响正则 ...
- c#的中英文混合字符串截取指定长度,startidx从0开始
//c#的中英文混合字符串截取指定长度,startidx从0开始 by gisoracle@126.com public string getStrLenB(string str, int start ...
随机推荐
- Deploying JAR Package & JSP Page in EBS R12.2.4 WLS
https://pan.baidu.com/s/1OomyeLdbGWxTtCKVcweo0w # Uninstall JAR JSP QRCODE 1.# 查找QRCODE相关文件位置 [root@ ...
- 用户人品预测大赛--就是gan队--竞赛分享
用户人品预测大赛--就是gan队--竞赛分享 DataCastle运营 发表于 2016-3-24 14:14:05 1194 1 0 答辩PPT
- 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 ...
- linux/unix命令参考
- EasyUI 的 combotree 加载数据后折叠起来,并且只允许单击子节点的写法
$(source).combotree({ url: '', width: kuan, valueField: 'id', textField: 'text', onlyLeafCheck: true ...
- 12C -- DDL日志
DDL日志和alert日志有相似的格式和行为.但是只包含DDL语句日志.oracle只是为数据库组件提供DDL日志,且需要将参数enable_ddl_logging设置为true. 在DDL日志中,每 ...
- windows环境telnet发送命令
telnet *.*.*.* port ,然后crtl+]进入命令模式,使用send发送消息,如:send hello,murphy 常用命令: open : 使用 openhostname 可以建立 ...
- Bash 中的特殊字符大全【转】
Linux下无论如何都是要用到shell命令的,在Shell的实际使用中,有编程经验的很容易上手,但稍微有难度的是shell里面的那些个符号,各种特殊的符号在我们编写Shell脚本的时候如果能够用的好 ...
- Linux给普通用户增加ssh权限
//1,创建用户 useradd name //2,修改密码 passwd name //3,修改ssh配置文件,在最后一行添加AllowUsers name vi /etc/ssh/sshd_con ...
- 【Linux】深入理解Linux中内存管理
主题:Linux内存管理中的分段和分页技术 回顾一下历史,在早期的计算机中,程序是直接运行在物理内存上的.换句话说,就是程序在运行的过程中访问的都是物理地址. 如果这个系统只运行一个程序,那么只要这个 ...