根据我的测试,标题中的错误仅在Google Chrome中引发。我正在对一个大的XML文件进行base64编码,以便可以下载它:
this.loader.src = "data:application/x-forcedownload;base64,"+
btoa("<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+"<"+this.gamesave.tagName+">"
+this.xml.firstChild.innerHTML
+"</"+this.gamesave.tagName+">");
this.loader
隐藏的iframe。
这个错误实际上是一个很大的变化,因为通常,谷歌浏览器会在btoa
通话时崩溃。Mozilla
Firefox在这里没有问题,因此问题与浏览器有关。我不知道文件中有任何奇怪的字符。实际上,我确实相信没有非ASCII字符。
问: 如何找到有问题的字符并将其替换,以使Chrome不再抱怨?
我试图使用Downloadify来启动下载,但是它不起作用。这是不可靠的,不会抛出任何错误以进行调试。
如果您有UTF8,请使用它(实际上与SVG源一起使用),例如:
btoa(unescape(encodeURIComponent(str)))
例:
var imgsrc = 'data:image/svg+xml;base64,' + btoa(unescape(encodeURIComponent(markup)));
var img = new Image(1, 1); // width, height values are optional params
img.src = imgsrc;
如果需要解码该base64,请使用以下命令:
var str2 = decodeURIComponent(escape(window.atob(b64)));
console.log(str2);
例:
var str = "äöüÄÖÜçéèñ";
var b64 = window.btoa(unescape(encodeURIComponent(str)))
console.log(b64);
var str2 = decodeURIComponent(escape(window.atob(b64)));
console.log(str2);
注意: 如果您需要将此内容用于移动浏览器,则可能需要从base64数据中删除所有空白…
function b64_to_utf8( str ) {
str = str.replace(/\s/g, '');
return decodeURIComponent(escape(window.atob( str )));
}
2017更新
这个问题一直困扰着我。 一个简单的事实是,atob并不真正处理UTF8字符串-仅是ASCII。另外,我不会使用像js-base64这样的膨胀软件。 但是webtoolkit确实有一个很小,很好且非常可维护的实现:
/**
*
* Base64 encode / decode
* http://www.webtoolkit.info
*
**/
var Base64 = {
// private property
_keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
// public method for encoding
, encode: function (input)
{
var output = "";
var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
var i = 0;
input = Base64._utf8_encode(input);
while (i < input.length)
{
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 +
this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
} // Whend
return output;
} // End Function encode
// public method for decoding
,decode: function (input)
{
var output = "";
var chr1, chr2, chr3;
var enc1, enc2, enc3, enc4;
var i = 0;
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
while (i < input.length)
{
enc1 = this._keyStr.indexOf(input.charAt(i++));
enc2 = this._keyStr.indexOf(input.charAt(i++));
enc3 = this._keyStr.indexOf(input.charAt(i++));
enc4 = this._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);
}
} // Whend
output = Base64._utf8_decode(output);
return output;
} // End Function decode
// private method for UTF-8 encoding
,_utf8_encode: function (string)
{
var utftext = "";
string = string.replace(/\r\n/g, "\n");
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);
}
} // Next n
return utftext;
} // End Function _utf8_encode
// private method for UTF-8 decoding
,_utf8_decode: function (utftext)
{
var string = "";
var i = 0;
var c, c1, c2, c3;
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;
}
} // Whend
return string;
} // End Function _utf8_decode
}
* 对于等于或小于2047(十六进制0x07FF)的字符,UTF-8表示分布在两个字节上。第一个字节将设置两个高位,第三个位清零(即0xC2至0xDF)。第二个字节将设置高位,第二个位将清零(即0x80至0xBF)。
问题内容: 这是我的Javascript代码 这是我的HTML 我遇到错误 错误:无法在“窗口”上执行“ atob”:要解码的字符串未正确编码 问题答案: 我有我的问题。这对于其他用户使用javascript(AnguarJs)保存图像和压缩图像应该会有所帮助。 我正在流动此链接以压缩图像 Github https://github.com/oukan/angular-image- compres
标准中提到了许多与字符集相关的概念:基本源字符集、基本执行字符集、基本执行范围字符集、执行字符集和执行范围字符集: 基本源字符集:91个图形字符,加上空格字符、HT、VT、FF、LF(仅借用ASCII中的名称缩写) 对于基本源字符集、基本执行字符集和基本执行范围字符集,我没有太多问题。 至于执行字符集,标准说它是由实现定义的,并且是特定于语言环境的,因此,我试图通过观察字符串文字初始化字符数组的字
问题内容: Linux / x86_64上的GCC 4.7是否具有默认字符编码,通过它可以验证和解码C源文件中字符串文字的内容?这是可配置的吗? 此外,将字符串文字从字符串文字链接到输出的数据部分时,它是否具有默认的执行字符编码?这是可配置的吗? 在任何配置中,源字符编码都可能与执行字符编码不同吗?(那gcc会在字符编码之间进行代码转换吗?) 问题答案: 我不知道这些选项的实际效果如何(不使用at
我只是在玩一些代码,我似乎不明白我哪里出错了。 我有一个“数字”字段,存储01-20之间的数字,后跟一个字母。我已经创建了一个局部变量,将前2个数字存储为字符串,但如果范围在01-20之间,我似乎无法使范围返回真。注意00不是有效的数字。 有什么想法吗?
问题内容: 使用场景 我们已经实现了一个Web服务,我们的Web前端开发人员在内部使用了该服务(通过php API)来显示产品数据。用户在网站上输入内容(即查询字符串)。在内部,网站通过api调用服务。 注意:我们使用restlet,而不是tomcat 原始问题 Firefox 3.0.10似乎尊重浏览器中选择的编码,并根据选择的编码对URL进行编码。这确实会导致ISO-8859-1和UTF-8的
本文向大家介绍如何在Python中执行包含Python代码的字符串?,包括了如何在Python中执行包含Python代码的字符串?的使用技巧和注意事项,需要的朋友参考一下 如果要执行Python语句,可以使用exec(string)。例如, 但是,如果您只想评估表达式的值,则可以使用。例如, 注意:同时使用eval和exec时请务必谨慎,因为它们是非常强大的功能 并可能在您的代码中引起非常细小的