2010-05-07 9 views
1

Je suis nouveau sur javascript et je voulais juste convertir une chaîne dans un format qu'une personne comme moi puisse lire. Voici un exemple de ce que je suis en train de faire ...Javascript Obtenir une chaîne au format kb

string2size (string) {// un certain codage impressionnant, je n'ai aucune idée comment faire retour awesomeAnswer }

maintenant le retour devrait donner moi quelque chose comme 56 octets ou 12kb ou 1mb selon combien la chaîne est. Donc si la chaîne est ... string = "il y avait une vieille femme qui vivait dans une chaussure"; then string2size (string) devrait retourner quelque chose comme 3kb.

Maintenant, je sais qu'il y a eu une discussion utf8 et je ne m'opposerais pas à l'ajout de cette fonction.

J'ai essayé les recherches sur google et Yahoo mais ils parlent d'utiliser php mais j'en ai vraiment besoin pour le javascript. Je remercie tout le monde pour leur temps. -Teske

+4

'il y avait une vieille femme qui vivait dans une chaussure' est de 42 octets, pas 3kb. Votre message entier n'est que de 736 octets. – kennebec

Répondre

4

Commencez par énumérer les unités que vous souhaitez utiliser. Par exemple:

// 1024-based units. Kibibyte, Mebibyte etc. 
// 
var BINARY_UNITS= [1024, 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi', 'Yo']; 

// SI units, also Hard Disc Manufacturers' rip-off kilobytes 
// 
var SI_UNITS= [1000, 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']; 

Ensuite, faire fonction de trouver et de diviser par la plus grande unité appropriée pour un certain nombre:

function unitify(n, units) { 
    for (var i= units.length; i-->1;) { 
     var unit= Math.pow(units[0], i); 
     if (n>=unit) 
      return Math.floor(n/unit)+units[i]; 
    } 
    return n; // no prefix, single units 
} 

appeler ensuite sur une longueur:

var desc= 'File, '+unitify(content.length, UNITS_BINARY)+'B'; 
desc+= ' or in SI, '+unitify(content.length, UNITS_SI)+'B'; 

// eg. File, 977KiB or in SI 1MB 

Je suis Vous ne savez pas ce que vous voulez dire avec UTF-8, mais si vous voulez connaître la longueur d'une chaîne de caractères codée en octets, vous devrez encoder cette chaîne en UTF-8. Heureusement, il y a un truc pas cher pour obtenir un encodeur UTF-8 en JavaScript:

var bytes= unescape(encodeURIComponent(chars)); 
alert(unitify(bytes, BINARY_UNITS)+'B'); 
1

Quelque chose comme cela vous aidera.

function getStringBytes(string) { 
    var bytes = 0; 
    var i; 

    for (i = 0; i < string.length; i++) { 
     var c = fixedCharCodeAt(string, i); 
     // in accordance with http://en.wikipedia.org/wiki/UTF-8#Description 
     bytes += c === false ? 0 : 
       c <= 0x007f ? 1 : 
       c <= 0x07FF ? 2 : 
       c <= 0xFFFF ? 3 : 
      c <= 0x1FFFFF ? 4 : 
      c <= 0x3FFFFFF ? 5 : 6; 
    } 
    return bytes; 
} 

function fixedCharCodeAt (str, idx) { 
    // ex. fixedCharCodeAt ('\uD800\uDC00', 0); // 65536 
    // ex. fixedCharCodeAt ('\uD800\uDC00', 1); // false 
    idx = idx || 0; 
    var code = str.charCodeAt(idx); 
    var hi, low; 
    if (0xD800 <= code && code <= 0xDBFF) { // High surrogate (could change last hex to 0xDB7F to treat high private surrogates as single characters) 
     hi = code; 
     low = str.charCodeAt(idx + 1); 
     if (isNaN(low)) { 
      throw new Error('High surrogate not followed by low surrogate'); 
     } 
     return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000; 
    } 
    if (0xDC00 <= code && code <= 0xDFFF) { // Low surrogate 
     return false; 
    } 
    return code; 
} 
+0

Salut Pavel, ce code a l'air génial! Pouvez-vous expliquer pourquoi vous aviez besoin de la méthode fixedCharCodeAt? –

+1

Salut Kirk, fixedCharCodeAt renvoie le point de code de caractère. Nous avons besoin d'un point de code pour la détermination de la taille des octets. Voir la page wiki pour plus de détails http://en.wikipedia.org/wiki/UTF-8#Description –

Questions connexes