在Google Chrome中指定blob编码

时间:2011-07-13 00:30:05

标签: javascript google-chrome encoding fileapi

以下代码(供应商规范化)工作正常并在Firefox 8中显示“➀➁➂测试”,但在谷歌浏览器中显示“—,测试。有没有办法在Google Chrome中保留blob编码,而不是使用文件系统API将文件写入临时文件系统?

var bb = new BlobBuilder;
bb.append("➀➁➂ Test");
var b = bb.getBlob("text/plain;charset=UTF-8");
var url = URL.createObjectURL(b);
open(url);

2 个答案:

答案 0 :(得分:10)

Gecko(Firefox),WebKit(Safari,Chrome)和Opera支持非标准btoa函数,用于在base 64中编码字符串。为了获得包含编码为UTF-的字符串的base 64字符串8您需要使用encodeURIComponent - unescape技巧。 encodeURIComponent将字符串编码为UTF-8网址,但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数据:-urls并且无论如何都会有一个荒谬的小网址限制。

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","");

答案 1 :(得分:0)

问题是Chrome中新标签的默认页面编码。当新窗口打开时(在window.open(url)之后),选择View>编码> Chrome菜单中的Unicode。这在Chrome 13中为我改变了显示的文本,从“—,“测试”到“➀➁➂测试”。

如果您想要一个可以让您在新窗口中打开blob的解决方案而不管默认编码,那么您可以依赖iframe中的文档在未明确指定其时继承父文档编码的事实自己的编码。因此,您可以打开一个窗口,其中包含带有Content-Type:text/html; charset=utf-8标头的空白HTML文档,然后将iframe附加到正文,并将src属性设置为blob网址。