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 相关文章推荐
JavaScript将Table导出到Excel实现思路及代码
Mar 13 Javascript
深入理解javascript的执行顺序
Apr 04 Javascript
js关于命名空间的函数实例
Feb 05 Javascript
Javascript定义类(class)的三种方法详解
Mar 13 Javascript
JQuery实现的图文自动轮播效果插件
Jun 19 Javascript
js实现大转盘抽奖游戏实例
Jun 24 Javascript
JavaScript图片轮播代码分享
Jul 31 Javascript
网页瀑布流布局jQuery实现代码
Oct 21 Javascript
解决同一页面中两个iframe互相调用jquery,js函数的方法
Dec 12 Javascript
BootStrap下的弹出框加载select2框架失败的解决方法
Aug 31 Javascript
仿ElementUI实现一个Form表单的实现代码
Apr 23 Javascript
Vue使用CDN引用项目组件,减少项目体积的步骤
Oct 30 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访问MYSQL数据库封装类(附函数说明)
2010/12/04 PHP
PHP中遍历stdclass object的实现代码
2011/06/09 PHP
ThinkPHP的I方法使用详解
2014/06/18 PHP
Laravel使用支付宝进行支付的示例代码
2017/08/16 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
javascript 兼容鼠标滚轮事件
2009/04/07 Javascript
Jquery 基础学习笔记
2009/05/29 Javascript
javascript十个最常用的自定义函数(中文版)
2009/09/07 Javascript
javascript深入理解js闭包
2010/07/03 Javascript
filters.revealTrans.Transition使用方法小结
2010/08/19 Javascript
只需20行代码就可以写出CSS覆盖率测试脚本
2013/04/24 Javascript
js实现checkbox全选、不选与反选的方法
2015/02/09 Javascript
JavaScript实现cookie的写入、读取、删除功能
2015/11/05 Javascript
使用JS实现图片展示瀑布流效果的实例代码
2016/09/12 Javascript
BootStrap 实现各种样式的进度条效果
2016/12/07 Javascript
Javascript oop设计模式 面向对象编程简单实例介绍
2016/12/13 Javascript
node.js发送邮件email的方法详解
2017/01/06 Javascript
基于vue2.0+vuex+localStorage开发的本地记事本示例
2017/02/28 Javascript
AngularJS 将再发布一个重要版本 然后进入长期支持阶段
2018/01/31 Javascript
vxe-table vue table 表格组件功能
2019/05/26 Javascript
JavaScript实现身份证验证代码实例
2019/08/26 Javascript
python中global用法实例分析
2015/04/30 Python
python利用有道翻译实现&quot;语言翻译器&quot;的功能实例
2017/11/14 Python
python如何为被装饰的函数保留元数据
2018/03/21 Python
根据tensor的名字获取变量的值方式
2020/01/04 Python
车间班长岗位职责
2013/11/30 职场文书
审计主管岗位职责
2014/01/31 职场文书
幼儿园保育员岗位职责
2014/04/13 职场文书
活动总结范文
2014/08/30 职场文书
副总经理岗位职责范本
2014/09/30 职场文书
2014年残联工作总结
2014/11/21 职场文书
2014年心理健康教育工作总结
2014/12/06 职场文书
采购员工作总结范文
2015/08/12 职场文书
高考百日冲刺决心书
2015/09/23 职场文书
解决python存数据库速度太慢的问题
2021/04/23 Python
MySQL查询学习之基础查询操作
2021/05/08 MySQL