今晚在写框架的表单验证类时,需要判断某个字符串长度是否在指定区间内,很自然地,想到了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的中文字符串(感谢oc_china提出),因为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编码,经小量数据测试通过,但暂未确定是否完全正确,盼有大牛指点一二。
以上本意是为了框架可以兼容多种编码格式,但一般在日常开发中,一个项目是已经可以确定为何种编码的,因此可以使用以下函数来方便地获取字符串长度:
-
inticonv_strlen(string$str[,string$charset=ini_get("iconv.internal_encoding")])
=======================签 名 档=======================
原文地址(我的博客):http://www.clanfei.com/2012/12/1671.html
欢迎访问交流,至于我为什么要多弄一个博客,因为我热爱前端,热爱网页,我更希望有一个更加自由、真正属于我自己的小站,或许并不是那么有名气,但至少能够让我为了它而加倍努力。。
=======================签 名 档=======================
分享到:
相关推荐
python拆分中英文混合字符串 - 按中文拆分
//不分中英文按字符串长度循环每个字符截取换行 这个是隔10个字符换行一次 String psStr="asdfghjklzxcvbnmzxcvbnmsdfghaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbb"; String aa=""; String bb=""; for (int i...
获得中英文混合字符串的字节长度 VB6.0源代码,VB 采用 StrConv、LenB函数实现的功能,就是这两个函数的用法示例,比较简单,面向VB编程初学者。关键的一句: Label2.Caption = LenB(StrConv(Text1.Text, ...
c#截取指定长度 中英文混合字符串 一个中文为两个字符计算,英文一个字符。
ASP中英文混合字符串的截取 ASP中英文混合字符串的截取
本人为了C++课程设计写的字符串处理头文件,支持中英文混合处理,多重通配符等等.
delphi 实现截取字符串中中文+英文混合截取,当字符串中包含中文和英文支付时,有时候会将一个中文截取1半,出现乱码。该demo能很好的解决该问题
主要介绍了JavaScript获取中英文混合字符串长度的方法,结合实例形式分析了javascript通过遍历转换字符串实现统计字符串长度的操作技巧,需要的朋友可以参考下
这个方法用来处理java中可能有一些特别的需要,一大串中英文混合,需要中间截断或是中英中间添加一些特别的标识,调用这个方法 第一个参数是要处理的字符串,第二个是要在中英字符中间插入的字符。调用就可以得到想...
一个JS函数,可以获取你当前输入的字符串的长度,其中中文字符和全角字符是2个长度
有同事在公司的OA上发了个贴子,介绍在javascript中如何得到中英文混合字符串的长度。 用的是正则表达式。 代码如下: var str = ”坦克是tank的音译”; var len = str.match(/[^ -~]/g) == null ? str.length : str....
13年(实习期间)飞娱互动有限公司面试游戏开发客户端/服务器端时的面试题的第一道编程题,当时就差这题没做出来,回去后想出来的。 截取一定长度的字符串,保证不把汉字截断。
字符数统计 中文英文字符分开统计 delphi 源码
精彩编程与编程技巧-如何取得中英混合字符串的长度? ...
本文实例讲述了Java编程实现中英混合字符串数组按首字母排序的方法。分享给大家供大家参考,具体如下: 在Java中对于字符串数组的排序,我们可以使用Arrays.sort(String[])方法很便捷的进行排序。例如: String[]...
自己输入一个字符串,字符串中可以包括字符和汉字,截取指定的字符串
js计算字符串长度,可以输入中文、英文、数字、中英文数字混合等,最后计算结果为字符串所占字节个数
中英文字符串的切割边界的确定算法 >> 一些背景知识: 1. 一个汉字在c\c++的存储, 使用2个字节(char)存储; 2. 汉字存储的第一个char, 其值一定大于'~'(0111 1110=126),否则将导致识别歧义; 此处, 使用"单ASCII...
可以截取中英文字符串,也可以含有字符,里面有好几个方法 有按字符个数截取 有按字节数来截取不会存在乱码