gpt4 book ai didi

javascript - 下载生成的二进制内容包含磁盘文件中的 utf-8 编码字符

转载 作者:行者123 更新时间:2023-11-29 22:18:27 25 4
gpt4 key购买 nike

我正在尝试使用以下代码将生成的 zip 文件从 chrome 扩展中保存到磁盘:

function sendFile (nm, file) {
var a = document.createElement('a');
a.href = window.URL.createObjectURL(file);
a.download = nm; // file name
a.style.display = 'none';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
}
function downloadZip (nm) {
window.URL = window.webkitURL || window.URL;
var content;
content = zip.generate();
var file = new Blob ([content], {type:'application/base64'});
sendFile ("x.b64", file);
content = zip.generate({base64:false});
var file = new Blob ([content], {type:'application/binary'});
sendFile ("x.zip", file);
}

目前,这会将我的 zip 内容保存为两个版本,第一个是 base64 编码的,当我使用 base64 -d 对其进行解码时,生成的 zip 是可以的。
第二个版本应该只保存原始数据(zip 文件),但是这个原始数据以 utf-8 编码到达我的磁盘。 (每个值 >= 0x80 都预先加上 0xc2)。那么如何摆脱这种utf-8编码呢?尝试了各种类型字符串,如 application/zip,或完全省略类型信息,它总是以 utf-8 编码到达。我也很好奇如何让浏览器自己存储/转换 base64 数据(第一种情况),以便它们作为解码后的二进制数据到达我的磁盘上......我使用的是 Chrome 版本 23.0.1271.95 m

PS:我在浏览器中使用 hexdump-utility 分析的第二个内容:它不包含 utf-8 编码(或者我的 hexdump 调用了一些进行隐式转换的东西)。为了完整起见(抱歉,它只是从 c 转过来的,所以它可能不是那么酷的 js 代码),我将它附加在这里:

function hex (bytes, val) {
var ret="";
var tmp="";
for (var i=0;i<bytes;i++) {
tmp=val.toString (16);
if (tmp.length<2)
tmp="0"+tmp;
ret=tmp+ret;
val>>=8;
}
return ret;
}
function hexdump (buf, len) {
var p=0;
while (p<len) {
line=hex (2,p);
var i;
for (i=0;i<16;i++) {
if (i==8)
line +=" ";
if (p+i<len)
line+=" "+hex(1,buf.charCodeAt(p+i));
else
line+=" ";
}
line+=" |";
for (i=0;i<16;i++) {
if (p+i<len) {
var cc=buf.charCodeAt (p+i);
line+= ((cc>=32)&&(cc<=127)&&(cc!='|')?String.fromCharCode(cc):'.');
}
}
p+=16;
console.log (line);
}
}

最佳答案

来自 working draft :

If element is a DOMString, run the following substeps:

  • Let s be the result of converting element to a sequence of Unicode characters [Unicode] using the algorithm for doing so in WebIDL [WebIDL].

  • Encode s as UTF-8 and append the resulting bytes to bytes.

所以字符串总是被转换成UTF-8,并且没有参数影响这个。这不会影响 base64 字符串,因为它们只包含每个代码点匹配单个字节的字符,代码点和字节具有相同的值。幸运的是,Blob 公开了较低级别的接口(interface)(直接字节),因此该限制并不重要。

你可以这样做:

var binaryString = zip.generate({base64: false}), //By glancing over the source I trust the string is in "binary" form
len = binaryString.length, //I.E. having only code points 0 - 255 that represent bytes
bytes = new Uint8Array(len);

for( var i = 0; i < len; ++i ) {
bytes[i] = binaryString.charCodeAt(i);
}

var file = new Blob([bytes], {type:'application/zip'});
sendFile( "myzip.zip", file );

关于javascript - 下载生成的二进制内容包含磁盘文件中的 utf-8 编码字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13790949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com