2010-05-07 2 views
1

저는 자바 스크립트를 처음 접했고 문자열을 나 같은 사람이 읽을 수있는 형식으로 변환하려고했습니다. 여기에 내가 뭘하려고 오전의 예 ...자바 스크립트 문자열을 kb 형식으로 변환하기

string2size (문자열)입니다 { 가 // 내가 반환 awesomeAnswer 을 만드는 방법 단서가 없다 굉장한 코딩}

이제 복귀 주어야한다 56 바이트 또는 12kb 또는 1mb 같은 문자열이 얼마나 많은지.

문자열이 ... 문자열 = "신발에 살았던 노인이있었습니다"; 그런 다음 string2size (string)는 3kb와 같은 것을 반환해야합니다.

이제는 utf8 대화가 있었고 나는 그 기능에 이의를 추가하지 않을 것이라고 알고 있습니다.

나는 구글과 야후 검색을 시도했지만 그들은 PHP를 사용하여 이야기하지만 실제로 자바 스크립트가 필요합니다. 나는 그들의 시간 동안 누구에게도 감사한다. -Teske

+4

'구두에 살았던 노파가있었습니다.'는 3kb가 아니라 42 바이트입니다. 전체 게시물은 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']; 

는 그 다음 번호의 가장 큰 적합한 장치에 의한 찾을 수있는 기능과 분할을 : 난

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 

:

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 
} 

는 그런 길이에 전화 UTF-8로 무엇을 의미하는지 모르겠지만 바이트로 인코딩 된 문자열의 길이를 찾으려면 해당 문자열을 UTF-8로 직접 인코딩해야합니다. 다행히도 JavaScript로 UTF-8 인코더를 사용하는 저렴한 트릭이 있습니다.

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

안녕하세요 Kirk, fixedCharCodeAt는 문자 코드 포인트를 반환합니다. 바이트 크기를 결정할 때 코드 포인트가 필요합니다. 자세한 내용은 위키 페이지를 참조하십시오. http://en.wikipedia.org/wiki/UTF-8#Description –

관련 문제