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 相关文章推荐
基于jquery自己写tab滑动门(通用版)
Oct 30 Javascript
JavaScript中的style.display属性操作
Mar 27 Javascript
JQuery表格内容过滤的实现方法
Jul 05 Javascript
js实现文章文字大小字号功能完整实例
Nov 01 Javascript
使用jQuery实现更改默认alert框体
Apr 13 Javascript
js实现页面刷新滚动条位置不变
Nov 27 Javascript
微信小程序 底部导航栏目开发资料
Dec 05 Javascript
微信小程序 MD5的方法详解及实例代码
Mar 10 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
Mar 19 Javascript
解决vue热替换失效的根本原因
Sep 19 Javascript
详解Vue、element-ui、axios实现省市区三级联动
May 07 Javascript
layui table 获取分页 limit的方法
Sep 20 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日期时间如何转换(UNIX时间戳和格式化日期)
2012/07/15 PHP
php反射类ReflectionClass用法分析
2016/05/12 PHP
基于php流程控制语句和循环控制语句(讲解)
2017/10/23 PHP
浅析php如何实现爬取数据原理
2018/09/27 PHP
PHP结合Ffmpeg快速搭建流媒体服务的实践记录
2018/10/31 PHP
jquery调用asp.net 页面后台的实现代码
2011/04/27 Javascript
alert和confirm功能介绍
2014/05/21 Javascript
Vue.js每天必学之计算属性computed与$watch
2016/09/05 Javascript
利用Query+bootstrap和js两种方式实现日期选择器
2017/01/10 Javascript
javascript实现圣旨卷轴展开效果(代码分享)
2017/03/23 Javascript
强大的JavaScript响应式图表Chartist.js的使用
2017/09/13 Javascript
Node.js静态服务器的实现方法
2018/02/28 Javascript
node 命令方式启动修改端口的方法
2018/05/12 Javascript
Vue-cli配置打包文件本地使用的教程图解
2018/08/02 Javascript
使用JavaScript破解web
2018/09/28 Javascript
Node.js HTTP服务器中的文件、图片上传的方法
2019/09/23 Javascript
vue iview 隐藏Table组件里的某一列操作
2020/11/13 Javascript
python随机生成指定长度密码的方法
2015/04/04 Python
Python计算已经过去多少个周末的方法
2015/07/25 Python
python 列表中[ ]中冒号‘:’的作用
2019/04/30 Python
python3射线法判断点是否在多边形内
2019/06/28 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
TensorFlow2.0矩阵与向量的加减乘实例
2020/02/07 Python
Python如何将模块打包并发布
2020/08/30 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
2020/11/24 Python
python 实现数据库中数据添加、查询与更新的示例代码
2020/12/07 Python
CSS3解决移动页面上点击链接触发色块的问题
2016/06/03 HTML / CSS
纯CSS3实现表单验证效果(非常不错)
2017/01/18 HTML / CSS
布鲁明戴尔百货店:Bloomingdale’s
2016/12/21 全球购物
特罗佩亚包官方网站:Tropea
2017/01/03 全球购物
丝芙兰墨西哥官网:Sephora墨西哥
2020/05/30 全球购物
Ajxa常见问题都有哪些
2014/03/26 面试题
商业房地产广告语
2014/03/13 职场文书
颁奖晚会主持词
2014/03/25 职场文书
Vue实现tab导航栏并支持左右滑动功能
2021/06/28 Vue.js
html5 录制mp3音频支持采样率和比特率设置
2021/07/15 Javascript