A-A+
	javascript统计计算中文字符串长度
JS的字符串都是string对象,可以用string对象的length属性可以获取其长度,但是无论是中文、全角符号以及英文最小长度单位都是1,这与php的strlen()并不相同。
如何让JS统计的字符串长度与php一致呢?这里的函数代码只是针对GBK下编码的字符,一个汉字等于二个字符。代码如下:
- 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;
 - }