javascript 判断中文字符长度的函数代码


Posted in Javascript onAugust 27, 2012

JS的字符串都是string对象,可以用string对象的length属性可以获取其长度,但是无论是中文、全角符号以及英文最小长度单位都是1,这与php的strlen()并不相同。

function strlen(str) { 
var s = 0; 
for(var i = 0; i < str.length; i++) { 
if(str.charAt(i).match(/[u0391-uFFE5]/)) { 
s += 2; 
} else { 
s++; 
} 
} 
return s; 
}

抓取出每个字符,匹配全角字符和汉字的,则计2个字符,其他的则计1个字符。
<script> 
alert (fucCheckLength("中国a")); 
function fucCheckLength(strTemp) 
{ 
var i,sum; 
sum=0; 
for(i=0;i<strTemp.length;i++) 
{ 
if ((strTemp.charCodeAt(i)>=0) && (strTemp.charCodeAt(i)<=255)) 
sum=sum+1; 
else 
sum=sum+2; 
} 
return sum; 
} 
</script>

会得到结果是:5 要得到的字节长度吧?请注意字节和字符的差异。而字节长度是和编码有关系的,比如"中国a",gbk/gb2312编码是5个字节,可是如果是utf-8,则是7个字节(utf-8下通常一个汉字3个字节)。
我们可以把所有字符转换在gbk再操作,实例
function Utf8ToUnicode(strUtf8) 
{ 
var bstr = ""; 
var nTotalChars = strUtf8.length; // total chars to be processed. 
var nOffset = 0; // processing point on strUtf8 
var nRemainingBytes = nTotalChars; // how many bytes left to be converted 
var nOutputPosition = 0; 
var iCode, iCode1, iCode2; // the value of the unicode. 
while (nOffset < nTotalChars) 
{ 
iCode = strUtf8.charCodeAt(nOffset); 
if ((iCode & 0x80) == 0) // 1 byte. 
{ 
if ( nRemainingBytes < 1 ) // not enough data 
break; 
bstr += String.fromCharCode(iCode & 0x7F); 
nOffset ++; 
nRemainingBytes -= 1; 
} 
else if ((iCode & 0xE0) == 0xC0) // 2 bytes 
{ 
iCode1 = strUtf8.charCodeAt(nOffset + 1); 
if ( nRemainingBytes < 2 || // not enough data 
(iCode1 & 0xC0) != 0x80 ) // invalid pattern 
{ 
break; 
} 
bstr += String.fromCharCode(((iCode & 0x3F) << 6) | ( iCode1 & 0x3F)); 
nOffset += 2; 
nRemainingBytes -= 2; 
} 
else if ((iCode & 0xF0) == 0xE0) // 3 bytes 
{ 
iCode1 = strUtf8.charCodeAt(nOffset + 1); 
iCode2 = strUtf8.charCodeAt(nOffset + 2); 
if ( nRemainingBytes < 3 || // not enough data 
(iCode1 & 0xC0) != 0x80 || // invalid pattern 
(iCode2 & 0xC0) != 0x80 ) 
{ 
break; 
} 
bstr += String.fromCharCode(((iCode & 0x0F) << 12) | 
((iCode1 & 0x3F) << 6) | 
(iCode2 & 0x3F)); 
nOffset += 3; 
nRemainingBytes -= 3; 
} 
else // 4 or more bytes -- unsupported 
break; 
} 
if (nRemainingBytes != 0) 
{ 
// bad UTF8 string. 
return ""; 
} 
return bstr; 
}

如何解决这个问题.本文介绍使用js来获取中文字长度方法

首先,我们定义一个新的函数getBytes()取得字符串的字节数,在javascript里,这个函数是标准函数。

String.prototype.getBytes = function() { 

var cArr = this.match(/[^x00-xff]/ig); 

return this.length + (cArr == null ? 0 : cArr.length); 

} 

function paramCheck(cur){ 

if(cur.value.getBytes() > 64){ 

alert("字符超过64个字符"); 

return false; 

} 

return true; 

}

getBytes用正则表达式来判断字符串中包含汉字的个数,包含的汉字都放到数组cArr中,这样cArr的长度就是汉字的总数。getBytes方法返回length加上汉字数,就是总的字节数。

只是使用了[^x00-xff],这个有点恶心,有些特殊字符也是能匹配到的,比如}等。

但是如果使用[^u4E00-u9FA5]的话,却不能匹配到中文……

以下是另外几种方法,大家可以测试下:
一种:

function _length(str){ 
var len=0; 
for(var i=0;i<str.length;i++){ 
if(str.charAt(i)>'~'){len+=2;}else{len++;} 
} 
return len; 
}

二种:
String.prototype.gblen = function() { 
var len = 0; 
for (var i=0; i<this.length; i++) { 
if (this.charCodeAt(i)>127 || this.charCodeAt(i)==94) { 
len += 2; 
} else { 
len ++; 
} 
} 
return len; 
} 
String.prototype.gbtrim = function(len, s) { 
var str = ''; 
var sp = s || ''; 
var len2 = 0; 
for (var i=0; i<this.length; i++) { 
if (this.charCodeAt(i)>127 || this.charCodeAt(i)==94) { 
len2 += 2; 
} else { 
len2 ++; 
} 
} 
if (len2 <= len) { 
return this; 
} 
len2 = 0; 
len = (len > sp.length) ? len-sp.length: len; 
for (var i=0; i<this.length; i++) { 
if (this.charCodeAt(i)>127 || this.charCodeAt(i)==94) { 
len2 += 2; 
} else { 
len2 ++; 
} 
if (len2 > len) { 
str += sp; 
break; 
} 
str += this.charAt(i); 
} 
return str; 
} 
var str1 = '世上最牛的@#%&们 世上最牛的@#%&们'; 
document.write('str1 = '+ str1 +' 
'); 
document.write('length = '+ str1.gblen() +' 
'); 
document.write('gbtrim(10) = '+ str1.gbtrim(10) +' 
'); 
document.write('gbtrim(10, \'…\') = '+ str1.gbtrim(10, '…') +' 
'); 
document.write('gbtrim(12, \'-\' ) = '+ str1.gbtrim(12, '-') +' 
'); // gbtrim(len 截取长度,按英文字节长度计算, s截取后的省略字符,如"…" ) 
// 备注: 这里中文字符都是当作两个长度来计算的,所以gbtrim中的len为10时,是显示最多5个汉字的。 
// 当汉字数大于5时,由于截取后加上“…”,所以只显示4个汉字。
Javascript 相关文章推荐
js获取url中指定参数值的示例代码
Dec 14 Javascript
JavaScript中的apply和call函数详解
Jul 20 Javascript
由浅入深剖析Angular表单验证
Jul 14 Javascript
利用Angularjs和原生JS分别实现动态效果的输入框
Sep 01 Javascript
详解Angular中的自定义服务Service、Provider以及Factory
Apr 22 Javascript
JS跳转手机站url的若干注意事项
Oct 18 Javascript
JavaScript canvas实现围绕旋转动画
Nov 18 Javascript
浅谈Vue数据绑定的原理
Jan 08 Javascript
JS设计模式之状态模式概念与用法分析
Feb 05 Javascript
Vue2.0 实现歌手列表滚动及右侧快速入口功能
Aug 08 Javascript
纯js+css实现仿移动端淘宝网站的弹出详情框功能
Dec 29 Javascript
JS中间件设计模式的深入探讨与实例分析
Apr 11 Javascript
Jquery 数据选择插件Pickerbox使用介绍
Aug 24 #Javascript
javascript数字格式化通用类 accounting.js使用
Aug 24 #Javascript
jquery动画4.升级版遮罩效果的图片走廊--带自动运行效果
Aug 24 #Javascript
jquery动画3.创建一个带遮罩效果的图片走廊
Aug 24 #Javascript
jquery动画2.元素坐标动画效果(创建一个图片走廊)
Aug 24 #Javascript
jquery动画1.加载指示器
Aug 24 #Javascript
基于jquery的bankInput银行卡账号格式化
Aug 22 #Javascript
You might like
PHP 5.3.0 安装分析心得
2009/08/07 PHP
PHPMailer发送邮件
2016/12/28 PHP
PHP实现链式操作的三种方法详解
2017/11/16 PHP
laravel框架之数据库查出来的对象实现转化为数组
2019/10/23 PHP
屏蔽F1~F12的快捷键的js函数
2010/05/06 Javascript
jquery增加时编辑jqGrid(实例代码)
2013/11/08 Javascript
简单对比分析JavaScript中的apply,call与this的使用
2015/12/04 Javascript
如何在Linux上安装Node.js
2016/04/01 Javascript
分享12个非常实用的JavaScript小技巧
2016/05/11 Javascript
浅谈JS使用[ ]来访问对象属性
2016/09/21 Javascript
js自定义QQ菜单效果
2017/01/10 Javascript
fullCalendar中文API官方文档
2017/02/07 Javascript
vue 怎么创建组件及组件使用方法
2017/07/27 Javascript
Bootstrap + AngularJS 实现简单的数据过滤字符查找功能
2017/07/27 Javascript
JS继承实现方法及优缺点详解
2020/09/02 Javascript
[01:17]Ti4 循环赛第一日回顾
2014/07/11 DOTA
[04:11]DOTA2上海特级锦标赛主赛事首日TOP10
2016/03/03 DOTA
Python函数式编程指南:对生成器全面讲解
2019/11/19 Python
学生如何注册Pycharm专业版以及pycharm的安装
2020/09/24 Python
python中使用np.delete()的实例方法
2021/02/01 Python
基于HTML5 Canvas 实现弹出框效果
2017/06/05 HTML / CSS
理肤泉加拿大官网:La Roche-Posay加拿大
2018/07/06 全球购物
Why we need EJB
2016/10/20 面试题
物业管理求职自荐信
2013/09/25 职场文书
大学生的自我鉴定范文
2014/01/21 职场文书
公务员诚信承诺书
2014/05/26 职场文书
电子商务系毕业生自荐信
2014/05/29 职场文书
党在我心中的演讲稿
2014/09/13 职场文书
法学专业大学生实习自我鉴定
2014/10/05 职场文书
个人四风问题整改措施
2014/10/24 职场文书
办公室主任个人总结
2015/02/28 职场文书
2015年六一儿童节演讲稿
2015/03/19 职场文书
会议简报格式范文
2015/07/20 职场文书
解决Golang中goroutine执行速度的问题
2021/05/02 Golang
SQL中的三种去重方法小结
2021/11/01 SQL Server
Netflix《海贼王》真人版剧集多张片场照曝光
2022/04/04 日漫