2010-05-07 1 views
1

Я новичок в javascript, и я просто хотел преобразовать строку в формат, который может читать такой человек, как я. Вот пример того, что я пытаюсь сделать ...Javascript Получение строки в формате kb

string2size (строка) {// некоторых удивительное кодирование я понятия не имею, как сделать возвращения awesomeAnswer }

теперь возвращение должно дать мне что-то вроде 56 байтов или 12kb или 1mb в зависимости от того, сколько строк.

так что если строка ... string = "была старуха, которая жила в обуви"; , тогда string2size (string) должен возвращать что-то вроде 3kb.

Теперь я знаю, что был разговор utf8, и я бы не стал возражать против этой функции.

Я пробовал поиск в Google и Yahoo, но они говорят об использовании php, но мне это действительно нужно для javascript. Я благодарю кого-то за их время. -Teske

+4

«была старуха, которая жила в обуви» - это 42 байт, а не 3kb. Всего сообщений всего 736 байт. – kennebec

ответ

4

Сначала перечислите единицы, которые вы хотите использовать. Например:

// 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']; 

Затем сделать функцию, чтобы найти и разделить на самой большой подходящей единицы для целого ряда:

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 
} 

Тогда звоните по длине:

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 

Я не уверен, что вы имеете в виду с UTF-8, но если вы хотите узнать длину символьной строки как закодированную в байты, вам придется сам кодировать эту строку в UTF-8. К счастью, есть дешевый трюк, чтобы получить кодер UTF-8 в JavaScript:

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

Нечто подобное поможет вам.

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

Привет, Павел, этот код выглядит потрясающе! Можете ли вы объяснить, почему вам нужен метод fixedCharCodeAt? –

+1

Привет Кирк, fixedCharCodeAt возвращает символ кода. Нам нужна кодовая точка для определения размера байтов. См. Страницу wiki для получения более подробной информации. Http://en.wikipedia.org/wiki/UTF-8#Description –

Смежные вопросы