以下代码(经过标准化的供应商)可以正常工作,并且在Firefox 8中显示为“➀➁➂Test”,但在Google Chrome中显示为“âžTest”。除了使用文件系统API将文件写入临时文件系统之外,还有什么方法可以保留Google Chrome中的Blob编码?
var b = new Blob(["➀➁➂ Test"], {type: "text/plain;charset=UTF-8"});
var url = URL.createObjectURL(b);
open(url);
Gecko(Firefox),WebKit(Safari,Chrome)和Opera支持非标准btoa
函数,用于在base 64中编码字符串。要获取base 64字符串,其中包含编码为UTF-8的字符串,您需要使用encodeURIComponent
-unescape
技巧。 encodeURIComponent
将字符串编码为UTF-8 URL,但unescape
将每个%xx
解码为单个字符。 btoa
期望使用任何所需编码的二进制字符串。
var base64 = btoa(unescape(encodeURIComponent(data)));
window.open("data:text/plain;charset=UTF-8;base64,"+base64,"UTF-8 Text");
当然,这在IE中不起作用,但是我认为IE 10将支持Blob
-API。谁知道它将如何处理编码。
PS:IE似乎无法window.open
data:-url,并且无论如何都会有可笑的小URL长度限制。
PPS:这在Chrome中对我有效:
var b = new Blob(["➀➁➂ Test"],{encoding:"UTF-8",type:"text/plain;charset=UTF-8"});
var url = URL.createObjectURL(b);
window.open(url,"_blank","");
问题是Chrome中新标签页的默认页面编码。当新窗口打开时(在window.open(url)
之后),从Chrome菜单中选择“视图”>“编码”>“ Unicode”。这将在Chrome 13中为我将显示的文本从“测试”更改为“测试”。
[如果您希望使用一种解决方案,无论使用哪种默认编码,都可以在新窗口中打开Blob,那么您可以依靠以下事实:如果iframe中的文档未明确指定其自身,则会继承父文档的编码编码。因此,您可以打开一个带有Content-Type:text/html; charset=utf-8
标头的空白HTML文档的窗口,然后将iframe附加到主体,并将src
属性设置为Blob URL。