首页 > 建站教程 > JS、jQ、TS >  js计算字符串长度,中文2个长度,英文算1个正文

js计算字符串长度,中文2个长度,英文算1个

    我爱模板网在做今日周边项目时,遇到一个奇葩的需求:输入框输入文字,如果是汉字和中文标点,就算两个长度,如果是英文就算一个长度。而且,输入框要限制:纯中文,就限制10个,超出截断,中文+英文混写或者纯英文,就限制20个,超出截断。之前我爱模板网写过一个有点类似的:js截取等长的英文和中文字符串 http://www.5imoban.net/jiaocheng/jquery/201907013590.html
    首先是计算问题,我爱模板网在网上找到了下面几个方法,都还不错:

方法一:
01String.prototype.gblen = function() { 
02  var len = 0; 
03  for (var i=0; i<this.length; i++) { 
04    if (this.charCodeAt(i)>127 || this.charCodeAt(i)==94) { 
05       len += 2; 
06     } else
07       len ++; 
08     
09   
10  return len; 
11}
方法二:
01function strlen(str){
02    var len = 0;
03    for (var i=0; i<str.length; i++) {
04     var c = str.charCodeAt(i);
05    //单字节加1
06     if ((c >= 0x0001 && c <= 0x007e) || (0xff60<=c && c<=0xff9f)) {
07       len++;
08     }
09     else {
10      len+=2;
11     }
12    }
13    return len;
14}
方法三:
01var jmz = {};
02jmz.GetLength = function(str) {
03  ///<summary>获得字符串实际长度,中文2,英文1</summary>
04  ///<param name="str">要获得长度的字符串</param>
05  var realLength = 0, len = str.length, charCode = -1;
06  for (var i = 0; i < len; i++) {
07    charCode = str.charCodeAt(i);
08    if (charCode >= 0 && charCode <= 128) realLength += 1;
09    else realLength += 2;
10  }
11  return realLength;
12};
方法四:
1var l = str.length;
2var blen = 0;
3for(i=0; i<l; i++) {
4if ((str.charCodeAt(i) & 0xff00) != 0) {
5blen ++;
6}
7blen ++;
8}
方法五:把双字节的替换成两个单字节的然后再获得长度
getBLen = function(str) {
  if (str == null) return 0;
  if (typeof str != "string"){
    str += "";
  }
  return str.replace(/[^\x00-\xff]/g,"01").length;
}

至于实现字符超出截断,请看下面代码:
01<input placeholder="在此输入备注"  value="{{value}}" focus="true" bindinput="inputValue" maxlength="20"></input>
02 
03data: {
04  value: '',
05  valueLength:0,
06},
07 
08inputValue: function (e) {
09  var val = e.detail.value;
10  var len = this.strlen(val);
11  if(len>20){
12    val = val.substring(0, this.strAt(val));
13  }
14  this.setData({
15    valueLength: this.strlen(val),
16    value: val,
17    showClear: val.length>0
18  })
19},
20strlen: function(str){
21  var len = 0;
22  for(var i = 0; i<str.length; i++) {
23    var c = str.charCodeAt(i);
24    if ((c >= 0x0001 && c <= 0x007e) || (0xff60 <= c && c <= 0xff9f)) {
25      len++;
26    } else {
27      len += 2;
28    }
29  }
30  return len;
31},
32//计算超过20的那个字符所在的索引
33strAt(str){
34  var pos = 0;
35  var len = 0;
36  for (var i = 0; i < str.length; i++) {
37    var c = str.charCodeAt(i);
38    if ((c >= 0x0001 && c <= 0x007e) || (0xff60 <= c && c <= 0xff9f)) {
39      len++;
40    } else {
41      len += 2;
42    }
43    if(len>20){
44      return pos;
45    }else{
46      pos++;
47    }
48  }
49},