2016-04-07 11 views
2

dizgisine dönüştürün. Şöyle bir jquery tefrika veriler var:JavaScript- dizgi dizisini

tarid=value&tarname=value&sel=3 

Ve ArrayBuffer dönüştürmek istiyoruz. Bundan sonra, tekrar orijinal formuna geri dönmem gerekiyor. Peki bunu nasıl yapabilirim?

+0

http://stackoverflow.com/a/25652412/ – guest271314

cevap

9

Bu yeterli mi?

function stringToArrayBuffer(str){ 
    if(/[\u0080-\uffff]/.test(str)){ 
     throw new Error("this needs encoding, like UTF-8"); 
    } 
    var arr = new Uint8Array(str.length); 
    for(var i=str.length; i--;) 
     arr[i] = str.charCodeAt(i); 
    return arr.buffer; 
} 

function arrayBufferToString(buffer){ 
    var arr = new Uint8Array(buffer); 
    var str = String.fromCharCode.apply(String, arr); 
    if(/[\u0080-\uffff]/.test(str)){ 
     throw new Error("this string seems to contain (still encoded) multibytes"); 
    } 
    return str; 
} 

veya gerçek UTF-8 kodlama gerekiyor

Düzenleme:

dikkat tam UTF-8 desteği/Yasal Uyarı: Bu kod bir bazı yabancı implementaion karşı test edilmez UTF-8 kodlayıcı veya kod çözücü. Yanlış sonuçlar doğurabilir.

Bu ürünü üretiminizde kullanmadan önce TEST EDİN!

function stringToArrayBuffer(str){ 
    if(/[\u0080-\uffff]/.test(str)){ 
     var arr = new Array(str.length); 
     for(var i=0, j=0, len=str.length; i<len; ++i){ 
      var cc = str.charCodeAt(i); 
      if(cc < 128){ 
       //single byte 
       arr[j++] = cc; 
      }else{ 
       //UTF-8 multibyte 
       if(cc < 2048){ 
        arr[j++] = (cc >> 6) | 192; 
       }else{ 
        arr[j++] = (cc >> 12) | 224; 
        arr[j++] = ((cc >> 6) & 63) | 128; 
       } 
       arr[j++] = (cc & 63) | 128; 
      } 
     } 
     var byteArray = new Uint8Array(arr); 
    }else{ 
     var byteArray = new Uint8Array(str.length); 
     for(var i = str.length; i--;) 
      byteArray[i] = str.charCodeAt(i); 
    } 
    return byteArray.buffer; 
} 

function arrayBufferToString(buffer){ 
    var byteArray = new Uint8Array(buffer); 
    var str = "", cc = 0, numBytes = 0; 
    for(var i=0, len = byteArray.length; i<len; ++i){ 
     var v = byteArray[i]; 
     if(numBytes > 0){ 
      //2 bit determining that this is a tailing byte + 6 bit of payload 
      if((cc&192) === 192){ 
       //processing tailing-bytes 
       cc = (cc << 6) | (v & 63); 
      }else{ 
       throw new Error("this is no tailing-byte"); 
      } 
     }else if(v < 128){ 
      //single-byte 
      numBytes = 1; 
      cc = v; 
     }else if(v < 192){ 
      //these are tailing-bytes 
      throw new Error("invalid byte, this is a tailing-byte") 
     }else if(v < 224){ 
      //3 bits of header + 5bits of payload 
      numBytes = 2; 
      cc = v & 31; 
     }else if(v < 240){ 
      //4 bits of header + 4bit of payload 
      numBytes = 3; 
      cc = v & 15; 
     }else{ 
      //UTF-8 theoretically supports up to 8 bytes containing up to 42bit of payload 
      //but JS can only handle 16bit. 
      throw new Error("invalid encoding, value out of range") 
     } 

     if(--numBytes === 0){ 
      str += String.fromCharCode(cc); 
     } 
    } 
    if(numBytes){ 
     throw new Error("the bytes don't sum up"); 
    } 
    return str; 
} 
+0

evet utf-8 i yayınlanmıştır kod UTF-8'in sadece küçük bir alt kümesidir –

+1

istediğim şey Bkz bölümü, bu uyumlu nerede ANSI ile; (temelde ingilizce karakterleri + en çok kullanılan semboller) Bir yabancı dili veya daha fazla "fantezi" sembolü kapsayacak şekilde, ilk uygulama artık onu kapsamaz. Tam bir UTF-8 sürümü ekledim, ancak en/kod çözmenin doğru olduğundan emin olmak için bazı referans uygulamalarına karşı test edilmedi. – Thomas

+0

Cevabınızın ilk kısmı benim istediğim. Diğer her şey (özellikle de diğer q/a "dizeleri ve ArrayBuffers arasında dönüştürme") tıpkı ..... tek istediğim bir ip olduğunu görmek! Bu nedenle, soruyu kısaca cevapladığınız ve cevabın nerede bittiğini ve fazladan detay verdiğinin netleştiğini (:-) gerek duymadığım için) teşekkürler. – user1863152