A-A+

javascript统计计算中文字符串长度

2016年01月28日 前端设计 暂无评论 阅读 5 views 次

JS的字符串都是string对象,可以用string对象的length属性可以获取其长度,但是无论是中文、全角符号以及英文最小长度单位都是1,这与php的strlen()并不相同。

如何让JS统计的字符串长度与php一致呢?这里的函数代码只是针对GBK下编码的字符,一个汉字等于二个字符。代码如下:

  1. function strlen(str) {  
  2.     var s = 0;  
  3.     for(var i = 0; i < str.length; i++) {  
  4.         if(str.charAt(i).match(/[u0391-uFFE5]/)) {  
  5.             s += 2;      
  6.         } else {  
  7.             s++;  
  8.         }  
  9.     }  
  10.     return s;  
  11. }  

抓取出每个字符,匹配全角字符和汉字的,则计2个字符,其他的则计1个字符,代码如下:

  1. <script>      
  2. alert (fucCheckLength("中国a"));      
  3. function fucCheckLength(strTemp)      
  4. {      
  5. var i,sum;      
  6. sum=0;      
  7. for(i=0;i<strTemp.length;i++)      
  8. {      
  9.   if ((strTemp.charCodeAt(i)>=0) && (strTemp.charCodeAt(i)<=255))      
  10.     sum=sum+1;      
  11.   else     
  12.     sum=sum+2;      
  13. }      
  14. return sum;      
  15. }      
  16. </script>  

会得到结果是:5

要得到的字节长度吧?请注意字节和字符的差异。而字节长度是和编码有关系的,比如"中国a",gbk/gb2312编码是5个字节,可是如果是utf-8,则是7个字节(utf-8下通常一个汉字3个字节)。

我们可以把所有字符转换在gbk再操作,实例代码如下:

  1. function Utf8ToUnicode(strUtf8)  
  2. {  
  3.         var bstr = "";  
  4.         var nTotalChars = strUtf8.length;        // total chars to be processed.  
  5.         var nOffset = 0;                                        // processing point on strUtf8  
  6.         var nRemainingBytes = nTotalChars;        // how many bytes left to be converted  
  7.         var nOutputPosition = 0;  
  8.         var iCode, iCode1, iCode2;                        // the value of the unicode.  
  9.         while (nOffset < nTotalChars)  
  10.         {  
  11.                 iCode = strUtf8.charCodeAt(nOffset);  
  12.                 if ((iCode & 0x80) == 0)                        // 1 byte.  
  13.                 {  
  14.                         if ( nRemainingBytes < 1 )                // not enough data  
  15.                                 break;  
  16.                         bstr += String.fromCharCode(iCode & 0x7F);  
  17.                         nOffset ++;  
  18.                         nRemainingBytes -= 1;  
  19.                 }  
  20.                 else if ((iCode & 0xE0) == 0xC0)        // 2 bytes  
  21.                 {  
  22.                         iCode1 =  strUtf8.charCodeAt(nOffset + 1);  
  23.                         if ( nRemainingBytes < 2 ||                        // not enough data  
  24.                                  (iCode1 & 0xC0) != 0x80 )                // invalid pattern  
  25.                         {  
  26.                                 break;  
  27.                         }  
  28.                         bstr += String.fromCharCode(((iCode & 0x3F) << 6) | (         iCode1 & 0x3F));  
  29.                         nOffset += 2;  
  30.                         nRemainingBytes -= 2;  
  31.                 }  
  32.                 else if ((iCode & 0xF0) == 0xE0)        // 3 bytes  
  33.                 {  
  34.                         iCode1 =  strUtf8.charCodeAt(nOffset + 1);  
  35.                         iCode2 =  strUtf8.charCodeAt(nOffset + 2);  
  36.                         if ( nRemainingBytes < 3 ||                        // not enough data  
  37.                                  (iCode1 & 0xC0) != 0x80 ||                // invalid pattern  
  38.                                  (iCode2 & 0xC0) != 0x80 )  
  39.                         {  
  40.                                 break;  
  41.                         }  
  42.                         bstr += String.fromCharCode(((iCode & 0x0F) << 12) |  
  43.                                         ((iCode1 & 0x3F) <<  6) |  
  44.                                         (iCode2 & 0x3F));  
  45.                         nOffset += 3;  
  46.                         nRemainingBytes -= 3;  
  47.                 }  
  48.                 else                                                                // 4 or more bytes -- unsupported  
  49.                         break;  
  50.         }  
  51.         if (nRemainingBytes != 0)  
  52.         {  
  53.                 // bad UTF8 string.  
  54.                 return "";  
  55.         }  
  56.         return bstr;  
  57. }  
标签:

给我留言