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

 今晚在写框架的表单验证类时,需要判断某个字符串长度是否在指定区间内,很自然地,想到了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") ] )

时间: 2024-10-29 03:36:41

PHP获取中英混合字符串长度的方法的相关文章

PHP中英混合字符串截取函数代码_php技巧

复制代码 代码如下: function get_word($string, $length, $dot = '..',$charset='gbk') { if(strlen($string) <= $length) { return $string; } $string = str_replace(array(' ',' ', '&', '"', '<', '>'), array('','','&', '"', '<', '>'), $st

计算中文混合字符串长度(一)

计算包含中文的混合字符串长度,一个中文.英文.数字 均为 1 function resolveContainCn($string, $charset = 'utf-8') { if ($string == '') { return ''; } if ($charset == 'utf-8') { $pa = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xb

计算中文混合字符串长度(二)

计算含中文的混合字符串长度 将字符串转换为 一个中文为 1,一个英文.数字 为 0.5 ,取最大整数长度值,类似腾讯微博计算字数长度方式 function asGbkLength($str, $fromEncode = 'utf-8') { return ceil(strlen(mb_convert_encoding($str, 'gbk', $fromEncode))/2); } $str = 'abcd计算字符串长度12345'; echo $str; echo '<br>'; echo

瀑布式应用推荐站上线 域名尽显中英混合风

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 域名快讯:近期国内首家"瀑布体验"式应用推荐网站,"应用联盟"启用域名applm.com正式上线了.据了解,应用联盟首页采用了较为先进和优美的"瀑布式"设计,用户只要不断下拉,新的APP应用就会持续涌现,像是瀑布一样连绵不绝. 应用联盟率先于其他机构引进了Pinterest模式,简单

怎么控制GridView中某个字段字符串长度限制在20个全角字符内

问题描述 怎么控制GridView中某个字段字符串长度限制在20个全角字符内,超过就使用省略号,谢谢 解决方案 解决方案二:///<summary>///截断字符串,长出部分用...代替///</summary>///<paramname="in_str"></param>///<paramname="short_len"></param>///<returns></retur

java中计算字符串长度的方法及u4E00与u9FBB的认识_java

字符串采用unicode编码的方式时,计算字符串长度的方法找出UNICODE编码中的汉字的代表的范围"\u4E00" 到"\u9FBB"之间,由于一个汉字代表两个字符所以可以采用如下方法进行计算字符串的长度 复制代码 代码如下: public static int getCharLength(String content) { int count = 0; for (int i = 0, len = content.length(); i < len; ++i

中英混合按键纠错 触宝输入法试用

相比于搜狗.百度和QQ等主流手机输入法,触宝输入法的知名度可能并不高,但其好用度却并不输主流输入法,诸如整句输入.超强的按键纠错功能以及中英混合输入等人性化功能一应俱全,并且是唯一一款荣获全球移动创新大奖的中国软件.评测环境输入法的安装及使用 Android平台输入法的安装与普通软件一样,可以通过PC端同步软件,或直接在电子市场中进行下载安装.想要使用触宝输入法的话,首先打开 系统设置-语言和键盘,勾选触宝输入法.之后在任意输入框内长按输入框,会弹出输入法选择窗口,选择触宝输入法即可.输入法的安

利用PHP函数计算中英文字符串长度的方法_php技巧

本文实例讲述了利用PHP函数计算中英文字符串长度的方法.分享给大家供大家参考.具体实现方法如下: 一般来说大家知道英文字符占一个字节,而中文字符gbk占两个字符,utf8占三个字符,很多人印象中php计算字符串长度就是strlen()函数,其实不然,它计算的是字节的长度而非字符的长度,那么如何获取一个字符串中字符的长度呢?还有有mb_strlen(). 具体代码如下: 复制代码 代码如下: echo $str = 'PHP点点通';  echo strlen($str); //3*1+3*3=1

SQL Server数据库获取TEXT字段的内容长度的方法

SQL Server数据库如何获取TEXT字段的内容长度呢?本文我们就来介绍一下SQL Server数据库如何获取TEXT字段的内容长度的方法,是通过DATALENGTH函数来实现的,接下来我们就通过DATALENGTH函数的语法及使用实例来了解一下这部分内容.   DATALENGTH用来返回任何表达式所占用的字节数. 语法:DATALENGTH ( expression ) 参数:expression,任何类型的表达式. 返回类型:int 注释:DATALENGTH 对 varchar.va