javascript 判断中文字符长度的函数代码

  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个汉字。