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 学习笔记(九)call和apply方法
Jan 11 Javascript
YUI的Tab切换实现代码
Apr 11 Javascript
JavaScript实现拼音排序的方法
Nov 20 Javascript
JavaScript设计模式之观察者模式(发布者-订阅者模式)
Sep 24 Javascript
js读取csv文件并使用json显示出来
Jan 09 Javascript
使用AJAX实现Web页面进度条的实例分享
May 06 Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
Sep 05 Javascript
JavaScript输入框字数实时统计更新
Jun 17 Javascript
Vue组件化通讯的实例代码
Jun 23 Javascript
在微信小程序中使用图表的方法示例
Apr 25 Javascript
uni-app使用微信小程序云函数的步骤示例
May 22 Javascript
在HTML5 localStorage中存储对象的示例代码
Apr 21 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程序的php代码
2008/04/07 PHP
php escape URL编码
2008/12/10 PHP
php中magic_quotes_gpc对unserialize的影响分析
2014/12/16 PHP
PHP常见漏洞攻击分析
2016/02/21 PHP
php通过执行CutyCapt命令实现网页截图的方法
2016/09/30 PHP
详解no input file specified 三种解决方法
2019/11/29 PHP
鼠标移动到一张图片时变为另一张图片
2006/12/05 Javascript
js压缩工具 yuicompressor 使用教程
2010/03/31 Javascript
js实现倒计时(距离结束还有)示例代码
2013/07/24 Javascript
JavaScript中的关键字&quot;VAR&quot;使用详解 分享
2013/07/31 Javascript
jquery实现上下左右滑动的方法
2015/02/09 Javascript
JavaScript中匿名函数用法实例
2015/03/23 Javascript
JS+HTML5实现上传图片预览效果完整实例【测试可用】
2017/04/20 Javascript
在vue项目中,使用axios跨域处理
2018/03/07 Javascript
node上的redis调用优化示例详解
2018/10/30 Javascript
JavaScript私有变量实例详解
2019/01/24 Javascript
基于vue、react实现倒计时效果
2019/08/26 Javascript
JS 图片压缩原理与实现方法详解
2020/04/29 Javascript
编写Python脚本抓取网络小说来制作自己的阅读器
2015/08/20 Python
python3大文件解压和基本操作
2017/12/15 Python
Python实现带参数与不带参数的多重继承示例
2018/01/30 Python
python-docx修改已存在的Word文档的表格的字体格式方法
2018/05/08 Python
Python OrderedDict的使用案例解析
2019/10/25 Python
Python搭建HTTP服务过程图解
2019/12/14 Python
基于html5 canvas实现漫天飞雪效果实例
2014/09/10 HTML / CSS
阿玛瑞酒店中文官方网站:Amari.com
2018/02/13 全球购物
中东奢侈品市场:Coveti
2019/05/12 全球购物
外贸学院会计专业应届生求职信
2013/11/14 职场文书
淘宝中秋节活动方案
2014/01/31 职场文书
2014年中秋寄语
2014/08/11 职场文书
学校交通安全责任书
2014/08/25 职场文书
2014年高一班主任工作总结
2014/12/05 职场文书
复兴之路展览观后感
2015/06/02 职场文书
2019年入党思想汇报格式与要求
2019/06/25 职场文书
tensorflow+k-means聚类简单实现猫狗图像分类的方法
2021/04/28 Python
如何使用Python提取Chrome浏览器保存的密码
2021/06/09 Python