我需要尝试在JavaScript中估计文本字符串的 DISK 大小(可以是原始文本或图像/音频/等的Base64编码字符串)。我不知道如何估计这一点。我可以找到谷歌搜索的唯一内容是.length
所以我想也许StackOverflow上的某个人可能知道......
我需要知道的原因是我有一个localStorage脚本需要(或者很想拥有)检查用户何时接近他的5MB(或IE中的10MB)配额并提示他们增加最大大小的能力对于域名。因此,如果用户按照
提示点击4.5MB的数据您的浏览器接近5MB数据上限。请通过以下方式增加最大数据 [关于增加浏览器的说明]
答案 0 :(得分:2)
这将取决于您的字符编码。如果使用ASCII编码,则它将是str.length个字节。如果使用UTF-16,它将是(str.length * 2)字节。如果使用UTF-8,它将取决于字符串中的字符。 (有些字符只占用1个字节,但其他字符最多可占用4个字节。)如果处理Base64编码的数据,则字符都在ASCII范围内,因此占用磁盘上的str.length字节。如果先解码它们并保存为二进制,则需要(str.length * 3/4)个字节。 (使用Base64,3个未编码的字节成为4个编码字节。)
BTW - 如果你还没有读过Joel Spolsky的绝对最低每个软件开发人员,绝对必须知道关于Unicode和字符集(没有借口!),你应该立即这样做。http://www.joelonsoftware.com/articles/Unicode.html
更新:如果你正在使用localStorage,我认为你熟悉window.localStorage.length,虽然这只会告诉你已经使用了多少,而不是你的新数据是否合适。我还强烈建议阅读 Dive into HTML5 ,尤其是关于存储的部分:
http://diveintohtml5.ep.io/storage.html
除非自编写以来发生了变化,否则我不确定您可以做什么,因为localStorage将每个域限制为5MB,用户无法增加它。
答案 1 :(得分: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));
答案 2 :(得分:0)
如果你在谈论内存使用情况,那么没有。没有办法可靠地确定使用的内存(至少是独立实现),因为这不是ECMAScript规范的一部分。这取决于你的字符编码。
答案 3 :(得分:0)
这取决于字符串中的数据及其存储方式。如果Base64编码的字符串存储为Base64编码的字符串,则长度与磁盘上的大小相同。如果没有,你必须解码它
我找到了一个解决方案(虽然看起来有点icky)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)
}
答案 4 :(得分:0)
您可以通过这种简单而精确的方式计算字符串中的字节数
var head = 'data:image/png;base64,';
var imgFileSize = Math.round((string.length - head.length)*3/4) ;
console.log("size is ",imgFileSize);