2010-01-31 2 views
0

동일한 방법으로 같은 데이터를 표시하려면 silverlight에서 호출 된 경고와 javascript에서 호출 한 경고를 모두 어떻게 얻습니까?Silverlight to Javascript interop UTF 인코딩/디코딩

예 : ! = ýÿ½ÿ½

System.Windows.Browser.HtmlPage.Window.Alert (data);

경고 (매개 변수);

Silverlight3 코드, 자바 스크립트 함수로 데이터를 전송 :

  System.Windows.Browser.HtmlPage.Window.Alert(data); 
     // data contains binary data read from files 

     data = Convert.ToBase64String(Encoding.UTF8.GetBytes(data)); 


     HtmlPage.Window.Eval("var data='"+data+"'makePOSTRequest('"+this.url+"',data);"); 

자바 스크립트 함수 :

 function makePOSTRequest(url,parameters) 
     { 
     ... 
     parameters = UTF8.encode(decode64(parameters)); 

     alert(parameters); 
     ... 
    } 

자바 스크립트 라이브러리 :

var UTF8 = { 

     // public method for url encoding 
     encode: function(string) { 
      string = string.replace(/\r\n/g, "\n"); 
      var utftext = ""; 

      for (var n = 0; n < string.length; n++) { 

       var c = string.charCodeAt(n); 

       if (c < 128) { 
        utftext += String.fromCharCode(c); 
       } 
       else if ((c > 127) && (c < 2048)) { 
        utftext += String.fromCharCode((c >> 6) | 192); 
        utftext += String.fromCharCode((c & 63) | 128); 
       } 
       else { 
        utftext += String.fromCharCode((c >> 12) | 224); 
        utftext += String.fromCharCode(((c >> 6) & 63) | 128); 
        utftext += String.fromCharCode((c & 63) | 128); 
       } 

      } 

      return utftext; 
     }, 

     // public method for url decoding 
     decode: function(utftext) { 
      var string = ""; 
      var i = 0; 
      var c = c1 = c2 = 0; 

      while (i < utftext.length) { 

       c = utftext.charCodeAt(i); 

       if (c < 128) { 
        string += String.fromCharCode(c); 
        i++; 
       } 
       else if ((c > 191) && (c < 224)) { 
        c2 = utftext.charCodeAt(i + 1); 
        string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); 
        i += 2; 
       } 
       else { 
        c2 = utftext.charCodeAt(i + 1); 
        c3 = utftext.charCodeAt(i + 2); 
        string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); 
        i += 3; 
       } 

      } 

      return string; 
     } 

    } 


    var keyStr = "ABCDEFGHIJKLMNOP" + 
      "QRSTUVWXYZabcdef" + 
      "ghijklmnopqrstuv" + 
      "wxyz/" + 
      "="; 

    function encode64(input) { 
     var output = ""; 
     var chr1, chr2, chr3 = ""; 
     var enc1, enc2, enc3, enc4 = ""; 
     var i = 0; 

     do { 
      chr1 = input.charCodeAt(i++); 
      chr2 = input.charCodeAt(i++); 
      chr3 = input.charCodeAt(i++); 

      enc1 = chr1 >> 2; 
      enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); 
      enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); 
      enc4 = chr3 & 63; 

      if (isNaN(chr2)) { 
       enc3 = enc4 = 64; 
      } else if (isNaN(chr3)) { 
       enc4 = 64; 
      } 

      output = output + 
     keyStr.charAt(enc1) + 
     keyStr.charAt(enc2) + 
     keyStr.charAt(enc3) + 
     keyStr.charAt(enc4); 
      chr1 = chr2 = chr3 = ""; 
      enc1 = enc2 = enc3 = enc4 = ""; 
     } while (i < input.length); 

     return output; 
    } 

    function decode64(input) { 
     var output = ""; 
     var chr1, chr2, chr3 = ""; 
     var enc1, enc2, enc3, enc4 = ""; 
     var i = 0; 

     // remove all characters that are not A-Z, a-z, 0-9, +, /, or = 
     var base64test = /[^A-Za-z0-9\+\/\=]/g; 
     if (base64test.exec(input)) { 
      alert("There were invalid base64 characters in the input text.\n" + 
      "Valid base64 characters are A-Z, a-z, 0-9, �+�, �/�, and �=�\n" + 
      "Expect errors in decoding."); 
     } 
     input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); 

     do { 
      enc1 = keyStr.indexOf(input.charAt(i++)); 
      enc2 = keyStr.indexOf(input.charAt(i++)); 
      enc3 = keyStr.indexOf(input.charAt(i++)); 
      enc4 = keyStr.indexOf(input.charAt(i++)); 

      chr1 = (enc1 << 2) | (enc2 >> 4); 
      chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); 
      chr3 = ((enc3 & 3) << 6) | enc4; 

      output = output + String.fromCharCode(chr1); 

      if (enc3 != 64) { 
       output = output + String.fromCharCode(chr2); 
      } 
      if (enc4 != 64) { 
       output = output + String.fromCharCode(chr3); 
      } 

      chr1 = chr2 = chr3 = ""; 
      enc1 = enc2 = enc3 = enc4 = ""; 

     } while (i < input.length); 

     return output; 
    } 

답변

0

당신이 당신의 문자를 UTF-8 인코딩해야합니까 , 또는 이러한 문자를 JavaScipt 문자열로 가져 오는 방법이 필요합니까? 유니 코드 이스케이프 시퀀스를 사용하는 것이 좋습니다 (Unicode at Mozilla Developer Center 참조). 예를 들어 저작권 문자는 "\ u00A9"로 표시됩니다. 유니 코드 이스케이프 시퀀스에 대한 좋은 점은 iso-8859-1을 사용하여 인코딩 된 소스 파일에 존재할 수 있지만 여전히 유니 코드 문자를 허용한다는 것입니다.

C#에서 이러한 이스케이프 시퀀스를 생성하는 방법에 대한 예제는 Converting Unicode strings to escaped ascii string을 참조하십시오.

parameters = UTF8.encode(decode64(parameters)); 

당신이 줄을 확신합니다

Encoding.UTF8.GetBytes(data) 

당신은 자바 스크립트에 다시 할 - :

0

당신은 두 번 UTF-8로 데이터를 인코딩하는 것, 당신은 실버에서 할 다음과 같아야합니다. -

parameters = UTF8.decode(decode64(parameters)); 

?

WebClient 또는 WebRequest을 Silverlight에서 사용하지 않는 이유가 있습니까?