2014-06-24 1 views
0

javascript에서 utf-8 문자열을 iconv() PHP 함수처럼 utf-16LE로 변환해야합니다.UTF-8에서 UTF-16LE 자바 스크립트

즉 :

iconv("UTF-8", "UTF-16LE", $string); 

출력이 같아야 :

49 00 (e) 00 64 00 65 00 78 00

는 I 디코딩이 FUNC 발견 UTF- 16LE 그리고 잘 작동하지만 인코딩하는 방법을 모르겠습니다.

function decodeUTF16LE(binaryStr) { 
    var cp = []; 
    for(var i = 0; i < binaryStr.length; i+=2) { 
     cp.push( 
      binaryStr.charCodeAt(i) | 
      (binaryStr.charCodeAt(i+1) << 8) 
     ); 
    } 

    return String.fromCharCode.apply(String, cp); 
} 

결론은 다운로드 할 수있는 이진 파일을 만드는 것입니다.

코드 :

function download(filename, text) { 
    var a = window.document.createElement('a'); 

    var byteArray = new Uint8Array(text.length); 
    for (var i = 0; i < text.length; i++) { 
     byteArray[i] = text.charCodeAt(i) & 0xff; 
    } 
    a.href = window.URL.createObjectURL(new Blob([byteArray.buffer], {'type': 'application/type'})); 

    a.download = filename; 

    // Append anchor to body. 
    document.body.appendChild(a); 
    a.click(); 

    // Remove anchor from body 
    document.body.removeChild(a); 
} 
+0

가 왜 사용자가 UTF8 파일을 다운로드하지 않습니다? 파일에 다른 내용이 있지만 문자열의 텍스트가 있습니까? – Bergi

+0

실행 파일을위한 특수 파일이기 때문에 korean과 같은 특수 문자가 변환되지 않으면 exe는 파일을 구문 분석 할 수 없습니다. 예 숫자 값이 많이 있습니다 (pack() 함수로 변환 됨). – Keveun

답변

1

이 그것을 어떻게해야이 :

var byteArray = new Uint8Array(text.length * 2); 
for (var i = 0; i < text.length; i++) { 
    byteArray[i*2] = text.charCodeAt(i) // & 0xff; 
    byteArray[i*2+1] = text.charCodeAt(i) >> 8 // & 0xff; 
} 

그것은 당신의 decodeUTF16LE 함수의 역이다. 두 함수 모두 BMP 외부의 코드 포인트와 함께 작동하지 않습니다.

1

덕분에 많은 BERGI이 완벽하게 UTF16 인코딩 기능에 표준 UTF8로 결합 작동합니다

function encodeUTF16LE(str) { 
    var out, i, len, c; 
    var char2, char3; 

    out = ""; 
    len = str.length; 
    i = 0; 
    while(i < len) { 
     c = str.charCodeAt(i++); 
     switch(c >> 4) 
     { 
      case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: 
      // 0xxxxxxx 
      out += str.charAt(i-1); 
      break; 
      case 12: case 13: 
      // 110x xxxx 10xx xxxx 
      char2 = str.charCodeAt(i++); 
      out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F)); 
      out += str.charAt(i-1); 
      break; 
      case 14: 
      // 1110 xxxx 10xx xxxx 10xx xxxx 
      char2 = str.charCodeAt(i++); 
      char3 = str.charCodeAt(i++); 
      out += String.fromCharCode(((c & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0)); 
      break; 
     } 
    } 

    var byteArray = new Uint8Array(out.length * 2); 
    for (var i = 0; i < out.length; i++) { 
     byteArray[i*2] = out.charCodeAt(i); // & 0xff; 
     byteArray[i*2+1] = out.charCodeAt(i) >> 8; // & 0xff; 
    } 

    return String.fromCharCode.apply(String, byteArray); 
} 
관련 문제