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 相关文章推荐
从阿里妈妈发现的几个不错的表单验证函数
Sep 21 Javascript
IE本地存储userdata的一个bug说明
Jul 01 Javascript
基于jQuery的的一个隔行变色,鼠标移动变色的小插件
Jul 06 Javascript
ExtJs的Date格式字符代码
Dec 30 Javascript
JavaScript在IE和FF下的兼容性问题
May 19 Javascript
js兼容火狐获取图片宽和高的方法
May 21 Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
Nov 25 Javascript
javascript 删除数组元素和清空数组的简单方法
Feb 24 Javascript
详解webpack2+node+react+babel实现热加载(hmr)
Aug 24 Javascript
jQuery插件simplePagination的使用方法示例
Apr 28 jQuery
解决VUE项目使用Element-ui 下拉组件的验证失效问题
Nov 07 Javascript
JavaScript使用canvas绘制坐标和线
Apr 28 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开发中页面出现乱码的一种解决方法
2007/07/29 PHP
php实现多张图片上传加水印技巧
2013/04/18 PHP
php实现parent调用父类的构造方法与被覆写的方法
2015/02/11 PHP
PHP实现对png图像进行缩放的方法(支持透明背景)
2015/07/15 PHP
js代码实现微博导航栏
2015/07/30 PHP
php版微信开发之接收消息,自动判断及回复相应消息的方法
2016/09/23 PHP
php利用ob_start()清除输出和选择性输出的方法
2018/01/18 PHP
phpMyAdmin通过密码漏洞留后门文件
2018/11/20 PHP
jquery键盘事件使用介绍
2011/11/01 Javascript
浏览器兼容console对象的简要解决方案分享
2013/10/24 Javascript
2014 HTML5/CSS3热门动画特效TOP10
2014/12/07 Javascript
js控制多图左右滚动切换效果代码分享
2015/08/26 Javascript
详解JavaScript时间格式化
2015/12/23 Javascript
Javascript中的对象和原型(二)
2016/08/12 Javascript
微信小程序前端源码逻辑和工作流
2016/09/25 Javascript
javascript中对象的定义、使用以及对象和原型链操作小结
2016/12/14 Javascript
vue拦截器Vue.http.interceptors.push使用详解
2017/04/22 Javascript
基于 D3.js 绘制动态进度条的实例详解
2018/02/26 Javascript
解决Vue在封装了Axios后手动刷新页面拦截器无效的问题
2018/11/08 Javascript
Nodejs监听日志文件的变化的过程解析
2019/08/04 NodeJs
nodejs+koa2 实现模仿springMVC框架
2020/10/21 NodeJs
[04:52]第二届DOTA2亚洲邀请赛主赛事第一天比赛集锦:OG娜迦海妖放大配合谜团大中3人
2017/04/02 DOTA
使用python删除nginx缓存文件示例(python文件操作)
2014/03/26 Python
浅析python 内置字符串处理函数的使用方法
2014/06/11 Python
详解C++编程中一元运算符的重载
2016/01/19 Python
Python3基于sax解析xml操作示例
2018/05/22 Python
Python图像滤波处理操作示例【基于ImageFilter类】
2019/01/03 Python
python3去掉string中的标点符号方法
2019/01/22 Python
Python使用while循环花式打印乘法表
2019/01/28 Python
美国电子元器件分销商:Newark element14
2018/01/13 全球购物
课程设计心得体会
2013/12/28 职场文书
20年同学聚会邀请函
2014/02/04 职场文书
优秀士兵先进事迹
2014/02/06 职场文书
银行职员个人的工作自我评价
2014/02/15 职场文书
暑期社会实践感言
2014/02/25 职场文书
Django一小时写出账号密码管理系统
2021/04/29 Python