10

我需要尝试估计JavaScript 中文本字符串(可以是原始文本或图像/音频/等的 Base64 编码字符串)的磁盘大小。我不确定如何估计。谷歌搜索时我唯一能找到的就是.length所以我想也许 StackOverflow 上的某个人可能知道......

我需要知道的原因是我有一个 localStorage 脚本需要(或希望拥有)能够检查用户何时接近其 5MB(或 IE 中的 10MB)配额并提示他们增加域的最大大小. 因此,如果用户点击 4.5MB 的数据,它会提示

您即将接近浏览器的 5MB 数据上限。请通过...增加您的最大数据... [有关增加浏览器的说明]

4

5 回答 5

3

这将取决于您的字符编码。如果您使用 ASCII 编码,它将是 str.length 个字节。如果您使用 UTF-16,它将是 (str.length * 2) 个字节。如果您使用 UTF-8,它将取决于字符串中的字符。(有些字符只占用 1 个字节,但其他字符最多占用 4 个字节。)如果您正在处理 Base64 编码的数据,这些字符都在 ASCII 范围内,因此会占用磁盘上的 str.length 个字节。如果您先将它们解码并保存为二进制文件,则需要 (str.length * 3/4) 个字节。(使用 Base64,3 个未编码字节变为 4 个编码字节。)

顺便说一句 - 如果您还没有阅读 Joel Spolsky 的The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!),您应该立即阅读。

http://www.joelonsoftware.com/articles/Unicode.html

更新:如果您使用 localStorage,我假设您熟悉 window.localStorage.length,尽管这只会告诉您已使用了多少,而不是您的新数据是否适合。我还强烈推荐阅读Dive into HTML5,尤其是关于存储的部分:

http://diveintohtml5.ep.io/storage.html

除非自编写以来发生了某些变化,否则我不确定您可以做什么,因为 localStorage 将每个域限制为 5MB,而用户无法增加它。

于 2010-11-29T22:29:29.767 回答
2

这不会是准确的,但您可以计算字符串中的字节数来粗略估计。

function bytes(string) {
    var escaped_string = encodeURI(string);
    if (escaped_string.indexOf("%") != -1) {
        var count = escaped_string.split("%").length - 1;
        count = count == 0 ? 1 : count;
        count = count + (escaped_string.length - (count * 3));
    }
    else {
        count = escaped_string.length;
    }

return count;

}

var mystring = 'tâ'; alert(bytes(mystring));

于 2010-11-29T22:30:45.787 回答
0

如果您在谈论内存使用情况,那么没有。没有办法可靠地确定使用的内存(至少独立于实现),因为这不是 ECMAScript 规范的一部分。这取决于您的字符编码。

于 2010-11-29T22:30:21.777 回答
0

这取决于字符串中的数据及其存储方式。如果您的 Base64 编码字符串存储为 Base64 编码字符串,则长度与磁盘上的大小相同。如果没有,您必须对其进行解码

我在这里找到了一个解决方案(虽然看起来有点恶心)

 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)
 }
于 2010-11-29T22:30:35.630 回答
0

您可以通过这种简单而精确的方式计算字符串中的字节数

var head = 'data:image/png;base64,';
var imgFileSize = Math.round((string.length - head.length)*3/4) ;

console.log("size is ",imgFileSize);
于 2016-06-07T10:21:03.953 回答