首頁  >  文章  >  web前端  >  javascript 判斷中文字元長度的函數程式碼

javascript 判斷中文字元長度的函數程式碼

高洛峰
高洛峰原創
2017-01-20 09:24:301287瀏覽

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)>&#39;~&#39;){len+=2;}else{len++;} 
} 
return len; 
}

二種:可以測試中文字元長度的函數代碼相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn