2010-01-31 3 views
0

Comment obtenir les deux alertes, l'une invoquée depuis silverlight et l'autre invoquée depuis javascript, pour afficher les mêmes données de la même manière.Silverlight to Javascript interop encodage/décodage UTF

par ex. ! = ½ Ã ½ ½

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

alerte (paramètres);

Code Silverlight3, l'envoi de données à la fonction javascript:

  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);"); 

fonction javascript:

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

     alert(parameters); 
     ... 
    } 

librairie javascript:

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; 
    } 

Répondre

0

Avez-vous besoin d'encoder UTF-8 vos personnages , ou avez-vous juste besoin d'un moyen d'obtenir ces caractères dans la chaîne JavaScipt? Je recommanderais d'utiliser des séquences d'échappement Unicode (voir Unicode au Mozilla Developer Center). Par exemple, le caractère de copyright est représenté par "\ u00A9". La bonne chose à propos des séquences d'échappement Unicode est qu'elles peuvent exister dans un fichier source qui est codé en utilisant iso-8859-1, mais permettent tout caractère Unicode.

Voir Converting Unicode strings to escaped ascii string pour un exemple de la façon de générer ces séquences d'échappement en C#.

0

Vous semblez coder les données UTF-8 deux fois, vous le faites en silverlight: -

Encoding.UTF8.GetBytes(data) 

et vous le faites à nouveau en Javascript

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

Etes-vous sûr cette ligne ne devrait pas être: -

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

?

Y at-il une raison pour laquelle vous n'utilisez pas WebClient ou WebRequest dans Silverlight pour faire cette publication?