为什么 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;
}
我正在使用对 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;
}