使用javascript计算textarea中的字节数

时间:2010-05-17 11:07:31

标签: javascript utf-8

我需要计算使用javascript编码UTF8时textarea的字节长度。知道怎么做吗?

谢谢!

10 个答案:

答案 0 :(得分:18)

encodeURIComponent(text).replace(/%[A-F\d]{2}/g, 'U').length

答案 1 :(得分:16)

结合各种答案,以下方法应该快速准确,并避免可能导致encodeURIComponent()错误的无效代理对的问题:

function getUTF8Length(s) {
  var len = 0;
  for (var i = 0; i < s.length; i++) {
    var code = s.charCodeAt(i);
    if (code <= 0x7f) {
      len += 1;
    } else if (code <= 0x7ff) {
      len += 2;
    } else if (code >= 0xd800 && code <= 0xdfff) {
      // Surrogate pair: These take 4 bytes in UTF-8 and 2 chars in UCS-2
      // (Assume next char is the other [valid] half and just skip it)
      len += 4; i++;
    } else if (code < 0xffff) {
      len += 3;
    } else {
      len += 4;
    }
  }
  return len;
}

答案 2 :(得分:14)

编辑:正如didier-l所指出的,此函数不能正确计算代理字符。

broofa的答案应该正确计算代理人,请参阅https://stackoverflow.com/a/12206089/274483

我在这里测试了两个提议版本以及一个天真的实现:

 getUTF8Length: function(string) {
    var utf8length = 0;
    for (var n = 0; n < string.length; n++) {
        var c = string.charCodeAt(n);
        if (c < 128) {
            utf8length++;
        }
        else if((c > 127) && (c < 2048)) {
            utf8length = utf8length+2;
        }
        else {
            utf8length = utf8length+3;
        }
    }
    return utf8length;
 }

结果是我的版本在firefox中稍微快一点,并且chrome(~30x)明显快于此处发布的版本。

答案 3 :(得分:14)

如果你的字符串中有非bmp字符,那就更复杂......

因为javascript执行UTF-16编码,而“字符”是2字节堆栈(16位),所有多字节字符(3个或更多字节)都不起作用:

    <script type="text/javascript">
        var nonBmpString = "foo€";
        console.log( nonBmpString.length );
        // will output 5
    </script>

字符“€”的长度为3个字节(24位)。 Javascript确实将其解释为2个字符,因为在JS中,字符是16位块。

因此,要正确获取混合字符串的字节大小,我们必须编写自己的函数fixedCharCodeAt();

    function fixedCharCodeAt(str, idx) {
        idx = idx || 0;
        var code = str.charCodeAt(idx);
        var hi, low;
        if (0xD800 <= code && code <= 0xDBFF) { // High surrogate (could change last hex to 0xDB7F to treat high private surrogates as single characters)
            hi = code;
            low = str.charCodeAt(idx + 1);
            if (isNaN(low)) {
                throw 'Kein gültiges Schriftzeichen oder Speicherfehler!';
            }
            return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;
        }
        if (0xDC00 <= code && code <= 0xDFFF) { // Low surrogate
            // We return false to allow loops to skip this iteration since should have already handled high surrogate above in the previous iteration
            return false;
            /*hi = str.charCodeAt(idx-1);
            low = code;
            return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;*/
        }
        return code;
    }

现在我们可以计算字节数......

    function countUtf8(str) {
        var result = 0;
        for (var n = 0; n < str.length; n++) {
            var charCode = fixedCharCodeAt(str, n);
            if (typeof charCode === "number") {
                if (charCode < 128) {
                    result = result + 1;
                } else if (charCode < 2048) {
                    result = result + 2;
                } else if (charCode < 65536) {
                    result = result + 3;
                } else if (charCode < 2097152) {
                    result = result + 4;
                } else if (charCode < 67108864) {
                    result = result + 5;
                } else {
                    result = result + 6;
                }
            }
        }
        return result;
    }

顺便说一下...... 你不应该使用encodeURI方法,因为它是一个本机浏览器函数;)

更多东西:


干杯

frankneff.ch / @frank_neff

答案 4 :(得分:2)

将字节长度计数功能添加到字符串

String.prototype.Blength = function() {
    var arr = this.match(/[^\x00-\xff]/ig);
    return  arr == null ? this.length : this.length + arr.length;
}

然后您可以使用 .Blength()来获取尺寸

答案 5 :(得分:1)

如何简单:

unescape(encodeURIComponent(utf8text)).length

技巧是encodeURIComponent似乎可以处理字符,而unescape可以处理字节。

答案 6 :(得分:0)

我一直在问自己同样的事情。这是我偶然发现的最佳答案:

http://www.inter-locale.com/demos/countBytes.html

以下是代码段:

<script type="text/javascript">
 function checkLength() {
    var countMe = document.getElementById("someText").value
    var escapedStr = encodeURI(countMe)
    if (escapedStr.indexOf("%") != -1) {
        var count = escapedStr.split("%").length - 1
        if (count == 0) count++  //perverse case; can't happen with real UTF-8
        var tmp = escapedStr.length - (count * 3)
        count = count + tmp
    } else {
        count = escapedStr.length
    }
    alert(escapedStr + ": size is " + count)
 }

但链接包含一个可以播放的实例。 “encodeURI(STRING)”是这里的构建块,但也请看一下encodeURIComponent(STRING)(已经在上一个答案中指出),看看哪一个符合您的需求。

此致

答案 7 :(得分:0)

encodeURI(text).split(/%..|./).length - 1

答案 8 :(得分:-1)

尝试以下方法:

function b(c) {
     var n=0;
     for (i=0;i<c.length;i++) {
           p = c.charCodeAt(i);
           if (p<128) {
                 n++;
           } else if (p<2048) {
                 n+=2;
           } else {
                 n+=3;
           }
      }return n;
}

答案 9 :(得分:-1)

设置meta UTF-8只是&amp;没关系!

<meta charset="UTF-8">
<meta http-equiv="content-type" content="text/html;charset=utf-8">

和js:

if($mytext.length > 10){
 // its okkk :)
}