Как я могу оценить размер диска строки с помощью JavaScript?

StackOverflow https://stackoverflow.com/questions/4308670

Вопрос

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

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

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

Это было полезно?

Решение

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

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â'; оповещение (байты (MyString));

Другие советы

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

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

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

Обновление: если вы используете LocalStorage, я предполагаю, что вы знакомы с window.localstorage.length, хотя это только говорит вам, сколько использовалось, а не подходящее ли ваши новые данные. Я также настоятельно рекомендую прочитать Погрузиться в HTML5, Особенно раздел на хранение:

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

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

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

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

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

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

console.log("size is ",imgFileSize);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top