2015-08-20 2 views
1

J'utilise un appel JAX à un script Perl qui renvoie le base64 pour un pdf, mais il me donne des problèmes dans IE. En fin de compte, je veux décoder les données base64 et créer un blob à utiliser pour PDFJS. Il fonctionne en chrome/firefox avec le code suivant:Pourquoi IE me donne-t-il des caractères chinois/mandarin lors du décodage de base64?

$.ajax({ 
    url: '/path/to/my.cgi', 
    type: "POST", 
    data: opts, 
    async: false, 
    success: function(data){ 
     var byteChars = atob(data); 
     var byteNumbers = new Array(byteChars.length); 
     for (var i = 0; i < byteChars.length; i++){ 
      byteNumbers[i] = byteChars.charCodeAt(i); 
     } 
     var byteArray = new Uint8Array(byteNumbers); 
     var blob = new Blob([byteArray], {type: "application/pdf;base64" }); 
     var url = URL.createObjectURL(blob); 
    } 
}); 

Cependant, il ne fait jamais passé var byteChars = atob(data). J'étais sous l'impression que cela devrait fonctionner dans> IE10, mais je viens de passer à autre chose et j'ai décidé d'essayer le code de this question. Pour une raison quelconque, il décode le base64 avec des caractères chinois/mandarin. Voici les résultats de IE11 et de chrome, respectivement:

ie chrome

J'ai essayé scripts base64 d'autres endroits, comme this, mais les résultats sont toujours les mêmes dans IE. Cela ne permet pas à PDFJS de charger le blob correctement.

Si quelqu'un pouvait éclairer, je l'apprécierais. Voici mon dernier code que j'ai:

$.ajax({ 
    ... 
    success: function(data){ 
     var userAgent = navigator.userAgent || navigator.vendor || window.opera; 
     var byteChars; 
     if(userAgent.indexOf("MSIE ") > 0 || !!navigator.userAgent.match(/Trident/)){ 
      // You can use either link I provided for this Base64.decode() 
      byteChars = Base64.decode(data); 
     } else { 
      byteChars = atob(data); 
     } 
     var byteNumbers = new Array(byteChars.length); 
     for (var i = 0; i < byteChars.length; i++){ 
      byteNumbers[i] = byteChars.charCodeAt(i); 
     } 
     var byteArray = new Uint8Array(byteNumbers); 
     var blob = new Blob([byteArray], {type: "application/pdf;base64" }); 
     var url = URL.createObjectURL(blob); 
    } 
}); 

Répondre

0

Ok, pour une raison quelconque, j'avais des problèmes avec les bibliothèques base64. Donc, j'ai juste utilisé la fonction suivante pour remplacer seulement atob, et cela a fonctionné parfaitement dans IE, iOS, Firefox, Chrome, Android et Edge.

var atob = function(input){ 
    var str = String(input).replace(/=+$/, ''); 
    for (
     // initialize result and counters 
     var bc = 0, bs, buffer, idx = 0, output = ''; 
     // get next character 
     buffer = str.charAt(idx++); 
     // character found in table? initialize bit storage and add its ascii value; 
     ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, 
        // and if not first of each 4 characters, 
        // convert the first 8 bits to one ascii character 
        bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0 
    ) { 
     // try to find character in table (0-63, not found => -1) 
     buffer = chars.indexOf(buffer); 
    } 
    return output; 
} 
0

Je vais avoir un problème similaire où IE/EDGE charge une chaîne codée base64 en caractères chinois/mandarin et lancer des erreurs parce qu'ils ne sont pas des caractères valides.

La réponse fournie ne fonctionne pas car le code n'est pas valide.