2010-11-29 43 views
8

Je dois essayer d'estimer la taille DISK d'une chaîne de texte (qui pourrait être du texte brut ou une chaîne codée Base64 pour une image/audio/etc) en JavaScript. Je ne suis pas sûr de savoir comment estimer cela. La seule chose que je peux trouver est Google .length donc je pensais que peut-être quelqu'un sur StackOverflow pourrait savoir ...Comment puis-je estimer la taille du disque d'une chaîne avec JavaScript?

La raison pour laquelle je dois savoir est que j'ai un script localStorage qui a besoin (ou aimerait avoir) la possibilité de vérifiez quand un utilisateur approche son quota de 5 Mo (ou 10 Mo dans IE) et demandez-lui d'augmenter la taille maximale du domaine. Donc, si un utilisateur frappe, disons, 4,5 Mo de données, il invite avec

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

+1

Je ne suis pas sûr de votre question. Pouvez-vous reformuler? Et: Pourquoi n'essaies-tu pas ce que tu as trouvé? – jwueller

+0

@elusive; Parce que la longueur d'une chaîne est différente de l'espace disque qu'elle occupe. –

+0

Oups! Je suis désolé, j'ai oublié d'ajouter le mot clé là-bas ... je l'ai ajouté maintenant en majuscules et en italiques pour que personne ne manque. J'ai complètement oublié d'ajouter que :( –

Répondre

2

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â'; alerte (octets (mystring));

2

Il va dépendre de l'encodage de caractères. Si vous utilisez le codage ASCII, ce sera str.length octets. Si vous utilisez UTF-16, ça va être (str.length * 2) octets. Si vous utilisez UTF-8, cela dépendra des caractères de la chaîne. (Certains caractères ne prendront qu'un octet, mais d'autres pourraient prendre jusqu'à 4 octets.) Si vous traitez des données codées en Base64, les caractères sont tous dans la plage ASCII et occuperaient par conséquent str.length octets sur le disque. Si vous les décodiez d'abord et sauvegardez en tant que binaire, cela prendra (str.length * 3/4) octets. (Avec base64, 3 octets non codés deviennent 4 octets codés.)

BTW - Si vous ne l'avez pas lu le minimum absolu de Joel Spolsky Chaque Software Developer Absolument, doit Positivement savoir sur Unicode et les jeux de caractères (No Excuses!) , 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, bien que cela ne vous dit combien a été utilisé, pas si vos nouvelles données s'adapter . Je vous recommande aussi fortement 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 à 5MB par domaine sans aucun moyen pour l'utilisateur de l'augmenter.

+0

Lire maintenant, merci! –

0

Si vous parlez de l'utilisation de la mémoire, alors non. Il n'y a aucun moyen de déterminer de façon fiable la mémoire utilisée (au moins implémentation indépendamment), car cela ne fait pas partie de la spécification ECMAScript. Cela dépend de votre encodage de caractères.

+0

Pas l'utilisation de la mémoire, désolé, je voulais dire la taille du disque SI enregistré sur un disque. J'ai mis à jour ma question avec plus de détails. –

0

Cela dépend des données de votre chaîne et de la façon dont elle est stockée. Si votre chaîne encodée en Base64 est stockée en tant que chaîne codée en 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) 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) 
} 
0

Vous pouvez compter le nombre d'octets dans une chaîne par ce simple et précis ainsi

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

console.log("size is ",imgFileSize);