2015-08-20 2 views
1

Я использую JAX-вызов для Perl-скрипта, который возвращает base64 для pdf, но это создает проблемы в IE. В конечном итоге я хочу декодировать данные base64 и создать blob для использования в PDFJS. Он работает в хром/Firefox со следующим кодом:Почему IE дает мне китайские/мандаринские символы при декодировании 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); 
    } 
}); 

Однако, он никогда не получает мимо var byteChars = atob(data). У меня создалось впечатление, что он должен работать в> IE10, но я просто перешел и решил попробовать код от this question. По какой-то причине он расшифровывает base64 с некоторыми китайскими/мандаринскими символами. Ниже приведены результаты IE11 и хрома, соответственно:

ie chrome

я пробовал base64 скрипты из других мест, как this, но результаты всегда одинаковы в IE. Это не позволяет PDFJS правильно загружать blob.

Если кто-нибудь может пролить свет, я был бы признателен. Вот мой последний код, который у меня есть:

$.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); 
    } 
}); 

ответ

0

Хорошо, по какой-то причине у меня были проблемы с библиотеками base64. Таким образом, я просто использовал следующую функцию для замены atob, и она отлично работала в IE, iOS, Firefox, Chrome, Android и 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

У меня аналогичная проблема, где IE/EDGE является выгрузкой base64 закодированной строки как китайский/символов Мандарина и метание ошибки, потому что они не являются допустимыми символами.

Предоставленный ответ не работает, так как код недействителен.

Смежные вопросы