Frage

Ich muss versuchen, das zu schätzen DISK Größe einer Textzeichenfolge in JavaScript (die Rohtext oder eine Base64-codierte Zeichenfolge für ein Bild / Audio / etc sein könnte). Ich bin mir nicht sicher, wie dies zu schätzen. Das einzige, was, wenn Googeln ich finden kann, ist .length so dass ich dachte, vielleicht jemand auf Stackoverflow wissen könnte ...

Der Grund, warum ich wissen müssen, ist i ein localstorage-Skript, dass Bedürfnisse (oder würde zu haben, lieben) die Fähigkeit zu überprüfen, wenn ein Benutzer seine 5MB nähert (oder 10 MB in IE) Quote und prompt sie die maximale Größe zu erhöhen für die Domäne. Also, wenn ein Nutzer trifft, sagen wir mal, 4.5MBs von Daten würde es prompt mit

  

Sie sind kurz vor Ihrem Browser 5MB Daten Kappe. Bitte erhöhen Sie Ihre max Daten von ... [Anweisungen für den Browser zu erhöhen]

War es hilfreich?

Lösung

Es ist nicht genau sein werden, aber die Anzahl von Bytes in einem String zählen kann eine grobe Schätzung zu erhalten.

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

Andere Tipps

Es wird auf dem Zeichencodierung ab. Wenn Sie ASCII-Codierung verwenden, es wird str.length Bytes sein. Wenn Sie UTF-16 verwenden, es geht zu sein (str.length * 2) Bytes. Wenn Sie UTF-8 verwenden, wird es auf die Zeichen in der Zeichenfolge abhängig zu sein. (Einige Zeichen nehmen nur 1 Byte, aber andere könnten bis zu 4 Bytes nehmen.) Wenn Sie mit Base64-codierten Daten zu tun hat, sind die Zeichen alle im ASCII-Bereich und deshalb würden besetzen str.length auf der Festplatte Bytes. Wenn Sie sie zuerst dekodieren und als binäre speichern, würde es dauern (str.length * 3/4) Bytes. (Bei Base64, 3 uncodierten Bytes werden 4 Bytes codiert.)

BTW - (! No Excuses) Wenn Sie nicht Joel Spolsky lesen Der absolute Minimum Jeden Software-Entwickler absolut positiv muss wissen über Unicode und Zeichensätze , sollten Sie dies sofort tun.

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

UPDATE: Wenn Sie localstorage verwenden, gehe ich davon aus, dass Sie vertraut mit window.localStorage.length, obwohl dies nur sagt, wie viel verwendet wurde, nicht, ob Ihre neuen Daten passen. Ich würde auch das Lesen sehr empfehlen Tauchen Sie ein in HTML5 , insbesondere der Abschnitt zur Lagerung:

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

Es sei denn, etwas seit seiner Schrift geändert hat, bin ich nicht sicher, was Sie tun können, als local Sie 5MB begrenzt pro Domain ohne dem Benutzer die Möglichkeit, es zu erhöhen.

Wenn Sie sich über die Speichernutzung sprechen, dann nicht. Es gibt keine Möglichkeit, zuverlässig die verwendeten Speicher Bestimmen (mindestens implementierungs unabhängig), da dies nicht Teil der ECMAScript spec ist. Es hängt von Ihrer Zeichencodierung.

Es hängt von den Daten in der Zeichenfolge und die Art und Weise gespeichert. Wenn Ihr Base64-codierte Zeichenfolge gespeichert ist, als eine Base64-String codiert, ist die Länge die gleiche wie die Größe auf dem Datenträger. Wenn nicht, müssen Sie es dekodieren

ich eine Lösung gefunden (obwohl es ein bisschen eklig scheint) hier

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

Sie können die Anzahl von Bytes in einem String zählen durch diese einfache und präzise Art und Weise

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

console.log("size is ",imgFileSize);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top