PHP获取中英混合字符串长度的方法


Posted in PHP onJune 07, 2014

今晚在写框架的表单验证类时,需要判断某个字符串长度是否在指定区间内,很自然地,想到了PHP中的strlen函数。

$str = 'Hello world!';
echo strlen($str); // 输出12

然而在PHP自带的函数中,strlen及mb_strlen都是通过计算字符串所占字节数来计算长度的,在不同的编码情况下,中文所占的字节数是不同的。在GBK/GB2312下,中文字符占2个字节,而在UTF-8下,中文字符占3个字节。
$str = '你好,世界!';
echo strlen($str); // GBK或GB2312下输出12,UTF-8下输出18

而我们在判断字符串长度时往往需要判断的是字符的数量,而非字符串所占字节数,如在UTF-8下的这段PHP代码:
$name = '张耕畅';
$len = strlen($name);
// 输出 FALSE,因为在UTF-8下三个中文占9个字节
if($len >= 3 && $len <= 8){
 echo 'TRUE';
}else{
 echo 'FALSE';
}

那么有什么方便而实用的方法可以获得含中文字符串的长度呢?可以用正则计算出中文字符的个数,在GBK/GB2312编码下除以2,UTF-8编码下则除以3,最后再加上非中文字符串的长度,但这样未免太过麻烦。

WordPress这么一段代码,借鉴如下:

$str = 'Hello,世界!';
preg_match_all('/./us', $str, $match);
echo count($match[0]); // 输出9

思想是用正则表达式将字符串分割成单个字符,并直接用count计算出匹配到的字符数,便是我们想要的结果了。

但以上代码在UTF-8编码下并不能处理GBK/GB2312的中文字符串,因为GBK/GB2312的中文字符会被识别为两个字符而计算出来的中文字符数量会翻倍,于是我想到了这么一个办法:

$tmp = @iconv('gbk', 'utf-8', $str);
if(!empty($tmp)){
 $str = $tmp;
}
preg_match_all('/./us', $str, $match);
echo count($match[0]);

可兼容GBK/GB2312及UTF-8编码,经小量数据测试通过,但暂未确定是否完全正确,盼有大牛指点一二。

以上本意是为了框架可以兼容多种编码格式,但一般在日常开发中,一个项目是已经可以确定为何种编码的,因此可以使用以下函数来方便地获取字符串长度:

int iconv_strlen ( string $str [, string $charset = ini_get("iconv.internal_encoding") ] )

PHP 相关文章推荐
php PDO中文乱码解决办法
Jul 20 PHP
php统计文件大小,以GB、MB、KB、B输出
May 29 PHP
ecshop实现smtp发送邮件
Feb 03 PHP
PHP超牛逼无限极分类生成树方法
May 11 PHP
WordPress开发中自定义菜单的相关PHP函数使用简介
Jan 05 PHP
php中照片旋转 (orientation) 问题的正确处理
Feb 16 PHP
PHP验证码无法显示的原因及解决办法
Aug 11 PHP
PHP基于redis计数器类定义与用法示例
Feb 08 PHP
PHP抽象类与接口的区别实例详解
May 09 PHP
Laravel 解决composer相关操作提示php相关异常的问题
Oct 23 PHP
PhpSpreadsheet设置单元格常用操作汇总
Nov 13 PHP
php中Swoole的热更新实现代码实例
Mar 04 PHP
使用PHP破解防盗链图片的一个简单方法
Jun 07 #PHP
PHP防止post重复提交数据的简单例子
Jun 07 #PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
Jun 06 #PHP
php 判断网页是否是utf8编码的方法
Jun 06 #PHP
PHP实现的博客欢迎提示功能(很特别哦)
Jun 05 #PHP
php中数字0和空值的区别分析
Jun 05 #PHP
兼容各大浏览器带关闭按钮的漂浮多组图片广告代码
Jun 05 #PHP
You might like
用PHP制作静态网站的模板框架(二)
2006/10/09 PHP
php安装xdebug/php安装pear/phpunit详解步骤(图)
2013/12/22 PHP
PHPMailer的主要功能特点和简单使用说明
2014/02/17 PHP
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
destoon网站转移服务器后搜索汉字出现乱码的解决方法
2014/06/21 PHP
php中出现空白页的原因及解决方法汇总
2014/07/08 PHP
php防止伪造数据从地址栏URL提交的方法
2014/08/24 PHP
prototype与jquery下Ajax实现的差别
2009/09/13 Javascript
js 实现css风格选择器(压缩后2KB)
2012/01/12 Javascript
JQuery EasyUI 日期控件如何控制日期选择区间
2014/05/05 Javascript
JS跨域交互(jQuery+php)之jsonp使用心得
2016/07/01 Javascript
nodejs根据ip数组在百度地图中进行定位
2017/03/06 NodeJs
详解angular中的作用域及继承
2017/05/31 Javascript
jQuery实现可兼容IE6的滚动监听功能
2017/09/20 jQuery
详解如何在微信小程序开发中正确的使用vant ui组件
2018/09/13 Javascript
vue-cli项目无法用本机IP访问的解决方法
2018/09/20 Javascript
详解一个小实例理解js原型和继承
2019/04/24 Javascript
JavaScript遍历数组的方法代码实例
2020/01/14 Javascript
详解关于Vue单元测试的几个坑
2020/04/26 Javascript
[46:50]Liquid vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python定时采集摄像头图像上传ftp服务器功能实现
2013/12/23 Python
Linux下编译安装MySQL-Python教程
2015/02/02 Python
Python实现获取nginx服务器ip及流量统计信息功能示例
2018/05/18 Python
Numpy与Pytorch 矩阵操作方式
2019/12/27 Python
推荐8款常用的Python GUI图形界面开发框架
2020/02/23 Python
Python-openpyxl表格读取写入的案例详解
2020/11/02 Python
scrapy-splash简单使用详解
2021/02/21 Python
美国正宗奢华复古手袋、珠宝及配饰网站:What Goes Around Comes Around
2018/07/21 全球购物
介绍一下结构化程序设计方法和面向对象程序设计方法的区别
2012/06/27 面试题
资料员岗位职责
2013/11/17 职场文书
大学新生军训自我鉴定
2014/03/18 职场文书
安全责任书范本
2014/04/15 职场文书
环境卫生标语
2014/06/09 职场文书
名人传读书笔记
2015/06/26 职场文书
小学二年级班主任工作经验交流材料
2015/11/02 职场文书
前端学习——JavaScript原生实现购物车案例
2021/03/31 Javascript