为什么 IE 在解码 base64 时给我 Chinese/Mandarin 个字符?

Why is IE giving me Chinese/Mandarin characters when decoding base64?

我正在使用对 perl 脚本的 JAX 调用,returns pdf 的 base64 但它在 IE 中给我带来了麻烦。最终我想解码 base64 数据并创建一个用于 PDFJS 的 blob。它在 chrome/firefox 中使用以下代码工作:

$.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 中的代码。出于某种原因,它正在用一些 Chinese/Mandarin 字符解码 base64。以下分别是 IE11 和 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);
    }
});

好的,出于某种原因,我在使用 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;
}