Как я могу оценить размер диска строки с помощью JavaScript? - PullRequest
8 голосов
/ 30 ноября 2010

Мне нужно попытаться оценить размер текстовой строки DISK (который может быть необработанным текстом или строкой в ​​кодировке Base64 для изображения / аудио / и т. Д.) В JavaScript.Я не уверен, как это оценить.Единственное, что можно найти в Google, - это .length, поэтому я подумал, что, возможно, кто-то из StackOverflow может знать ...

Причина, по которой мне нужно знать, состоит в том, что у меня есть скрипт localStorage, который нуждается (или хотел бы) возможность проверить, когда пользователь приближается к своей квоте 5 МБ (или 10 МБ в IE), и предложить им увеличить максимальный размер домена.Таким образом, если пользователь нажимает, скажем, 4,5 МБ данных, он будет запрашивать с

Вы приближаетесь к пределу данных в 5 МБ браузера.Пожалуйста, увеличьте ваши максимальные данные на ... [инструкции по увеличению для браузера]

Ответы [ 5 ]

2 голосов
/ 30 ноября 2010

Это не будет точным, но вы можете посчитать количество байтов в строке, чтобы получить приблизительную оценку.

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;
    }</p>

<pre><code>return count;

}

var mystring = 'tâ'; оповещения (байты (MyString));

2 голосов
/ 30 ноября 2010

Это будет зависеть от вашей кодировки символов.Если вы используете кодировку ASCII, это будут байты str.length.Если вы используете UTF-16, это будет (str.length * 2) байтов.Если вы используете UTF-8, это будет зависеть от символов в строке.(Некоторые символы занимают только 1 байт, а другие могут занимать до 4 байт.) Если вы работаете с данными в кодировке Base64, все символы находятся в диапазоне ASCII и поэтому занимают байты str.length на диске.Если вы сначала декодируете их и сохраняете в двоичном виде, это займет (str.length * 3/4) байтов.(С Base64 3 некодированных байта становятся 4 закодированными байтами.)

BTW - Если вы не читали Джоэла Спольски "Абсолютный минимум каждого разработчика программного обеспечения, абсолютно, положительно должен знать о Unicode и наборах символов (нетИзвините!) , вы должны сделать это немедленно.

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

ОБНОВЛЕНИЕ: Если вы используете localStorage, я предполагаю, что вы знакомы с window.localStorage.lengthхотя это только говорит о том, сколько было использовано, а не о том, подойдут ли ваши новые данные.Я также настоятельно рекомендую прочитать Погружение в HTML5 , особенно раздел о хранилище:

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

Если что-то не изменилось с момента его написания, я не уверенчто вы можете сделать, так как localStorage ограничивает вас 5 МБ на домен, и у пользователя нет возможности его увеличить.

0 голосов
/ 07 июня 2016

Вы можете посчитать количество байтов в строке простым и точным способом

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

console.log("size is ",imgFileSize);
0 голосов
/ 30 ноября 2010

Это зависит от данных в вашей строке и способа ее хранения.Если ваша строка в кодировке 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)
 }
0 голосов
/ 30 ноября 2010

Если вы говорите об использовании памяти, то нет.Не существует способа надежного определения используемой памяти (по крайней мере, независимо от реализации), поскольку это не является частью спецификации ECMAScriptЭто зависит от вашей кодировки символов.

...