Question

Je dois essayer d'estimer la DISK taille d'une chaîne de texte (qui peut être du texte brut ou une chaîne Base64 pour une image / audio / etc) en JavaScript. Je ne sais pas comment estimer cela. La seule chose quand googler je peux trouver est .length donc je pensais que peut-être quelqu'un sur StackOverflow pourrait savoir ...

La raison pour laquelle je dois savoir est que j'ai un script localStorage que les besoins (ou aimeraient avoir) la possibilité de vérifier si un utilisateur est presque son 5MB (ou 10MB dans IE) quota et les invite à augmenter la taille maximale pour le domaine. Ainsi, si un utilisateur frappe, permet de dire, 4.5MBs de données qu'il avait rapide avec

  

Vous approchez votre navigateur cap de données 5MB. S'il vous plaît augmenter vos données par max ... [instructions sur l'augmentation pour le navigateur]

Était-ce utile?

La solution

Il ne va pas être exact, mais vous pouvez compter le nombre d'octets dans une chaîne pour obtenir une estimation approximative.

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

Autres conseils

Il va dépendre de l'encodage de caractères. Si vous utilisez le codage ASCII, il va être octets str.length. Si vous utilisez UTF-16, il va être (str.length * 2) octets. Si vous utilisez UTF-8, il va dépendre des caractères de la chaîne. (Certains caractères ne prennent 1 octet, mais d'autres peuvent prendre jusqu'à 4 octets). Si vous traitez avec des données codées en base64, les personnages sont tous dans la plage ASCII et seraient donc occuper str.length octets sur le disque. Si vous les décoder d'abord et enregistrer en tant que binaire, il faudrait (str.length * 3/4) octets. (Avec base64, 3 octets non-codés deviennent 4 octets codés.)

BTW - (No Excuses) Si vous ne l'avez pas lu , Joel Spolsky de Le logiciel Chaque Absolute minimum Developer Absolument, Positively qu'il faut savoir sur Unicode et les jeux de caractères, vous devriez le faire immédiatement

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

Mise à jour: Si vous utilisez localStorage, je suppose que vous êtes familier avec window.localStorage.length, pas si vos nouvelles données si cela ne vous indique combien a été utilisé conviendront. Je conseillerais aussi vivement la lecture Plongez dans HTML5 , en particulier la section sur le stockage:

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

À moins que quelque chose a changé depuis son écriture, je ne suis pas sûr de ce que vous pouvez faire comme localStorage vous limite à 5 Mo par domaine sans aucun moyen pour l'utilisateur d'augmenter.

Si vous parlez d'utilisation de la mémoire, alors non. Il n'y a aucun moyen de déterminer de manière fiable la mémoire utilisée (au moins l'implémentation indépendante), puisque ce ne fait pas partie de la spécification ECMAScript. Cela dépend de l'encodage de caractères.

Cela dépend des données de votre chaîne et la façon dont il est stocké. Si votre chaîne Base64 est stockée sous forme de chaîne base64, la longueur est la même que la taille sur le disque. Sinon, vous devez le décoder

J'ai trouvé une solution (bien qu'il semble un peu dégueu)

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

Vous pouvez compter le nombre d'octets dans une chaîne de cette façon simple et précise

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

console.log("size is ",imgFileSize);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top