【问题标题】:How can I estimate the disk size of a string with JavaScript?如何使用 JavaScript 估计字符串的磁盘大小?
【发布时间】:2011-05-17 13:23:45
【问题描述】:

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

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

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

【问题讨论】:

  • 我不确定你的问题是什么。你能改写吗?并且:你为什么不试试你发现的东西?
  • @SimpleCoder:磁盘空间?你说的是内存吗?那么不,没有办法确定。至少不是独立于实现的,因为这不是规范的一部分。
  • @Darin Dimitrov;不要光顾我。你错过了重点。提问者想要估计一个字符串将占用的磁盘空间如果它被放置在磁盘上。
  • @SimpleCoder,好的,现在说得通了。下一个问题:什么编码?
  • @Darin Dimitrov:我建议尽快去读一本关于计算机的书,而不是说你周围的每个人都是愚蠢的。

标签: javascript string base64 diskspace string-length


【解决方案1】:

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

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

console.log("size is ",imgFileSize);

【讨论】:

    【解决方案2】:

    这将取决于您的字符编码。如果您使用 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 的每个软件开发人员绝对、肯定必须了解 Unicode 和字符集的绝对最低要求(没有任何借口!),您应该立即阅读。 p>

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      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));

      【讨论】:

        【解决方案4】:

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

        我找到了解决方案(虽然看起来有点恶心)here

         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)
         }
        

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 不是内存使用,对不起,我的意思是磁盘大小如果保存到磁盘。我已经用更多细节更新了我的问题。
          猜你喜欢
          • 2014-09-12
          • 2012-06-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-25
          • 1970-01-01
          • 2019-08-01
          • 1970-01-01
          相关资源
          最近更新 更多