更改JavaScript字符串编码

目前我有一个很大的JavaScript字符串,我试图写入一个文件,但采用不同的编码(ISO-8859-1)。 我希望使用像downloadify这样的东西。 Downloadify只接受普通的JavaScript字符串或base64编码的字符串。

因此,我决定使用JSZip压缩我的字符串,它生成一个很好的base64编码字符串,可以传递给downloadify,然后下载到我的桌​​面。 好哇! 问题是我压缩的字符串当然仍然是错误的编码。

幸运的是,JSZip可以将Uint8Array作为数据而不是字符串。 那么有没有办法将JavaScript字符串转换为ISO-8859-1编码的字符串并将其存储在Uint8Array中?

或者,如果我接近这一切都错了,那么一起有更好的解决方案吗? 是否有一个花哨的JavaScript字符串类可以使用不同的内部编码?

编辑:为了澄清,我不是将这个字符串推送到网页,所以它不会自动转换为我。 我正在做这样的事情:

var zip = new JSZip(); zip.file("genSave.txt", result); return zip.generate({compression:"DEFLATE"}); 

为此,我需要使用正确的编码结果(而JSZip只需要字符串,数组缓冲区或uint8arrays)。

最终编辑(这不是一个重复的问题,因为结果没有显示在浏览器中或传输到可以更改编码的服务器):

事实certificate这比我想象的更加模糊,所以我最终推出了自己的解决方案。 它不像正确的解决方案那样强大,但它会将JavaScript字符串转换为windows-1252编码,并将其粘贴在Uint8Array中:

 var enc = new string_transcoder("windows-1252"); var tenc = enc.transcode(result); //This is now a Uint8Array 

然后你可以像我一样在数组中使用它:

 //Make this into a zip var zip = new JSZip(); zip.file("genSave.txt", tenc); return zip.generate({compression:"DEFLATE"}); 

或者使用此字符串编码库将其转换为windows-1252编码的字符串:

 var string = TextDecoder("windows-1252").decode(tenc); 

要使用此function,请使用:

  

或包括这个:

 function string_transcoder (target) { this.encodeList = encodings[target]; if (this.encodeList === undefined) { return undefined; } //Initialize the easy encodings if (target === "windows-1252") { var i; for (i = 0x0; i <= 0x7F; i++) { this.encodeList[i] = i; } for (i = 0xA0; i <= 0xFF; i++) { this.encodeList[i] = i; } } } string_transcoder.prototype.transcode = function (inString) { var res = new Uint8Array(inString.length), i; for (i = 0; i < inString.length; i++) { var temp = inString.charCodeAt(i); var tempEncode = (this.encodeList)[temp]; if (tempEncode === undefined) { return undefined; //This encoding is messed up } else { res[i] = tempEncode; } } return res; }; encodings = { "windows-1252": {0x20AC:0x80, 0x201A:0x82, 0x0192:0x83, 0x201E:0x84, 0x2026:0x85, 0x2020:0x86, 0x2021:0x87, 0x02C6:0x88, 0x2030:0x89, 0x0160:0x8A, 0x2039:0x8B, 0x0152:0x8C, 0x017D:0x8E, 0x2018:0x91, 0x2019:0x92, 0x201C:0x93, 0x201D:0x94, 0x2022:0x95, 0x2013:0x96, 0x2014:0x97, 0x02DC:0x98, 0x2122:0x99, 0x0161:0x9A, 0x203A:0x9B, 0x0153:0x9C, 0x017E:0x9E, 0x0178:0x9F} }; 

事实certificate这比[作者]想象的更加模糊,所以[作者]最终推出了他自己的解决方案。 它不像正确的解决方案那样强大,但它会将JavaScript字符串转换为windows-1252编码,并将其粘贴在Uint8Array中:

 var enc = new string_transcoder("windows-1252"); var tenc = enc.transcode(result); //This is now a Uint8Array 

然后你可以像[作者]那样在数组中使用它:

 //Make this into a zip var zip = new JSZip(); zip.file("genSave.txt", tenc); return zip.generate({compression:"DEFLATE"}); 

或者使用此字符串编码库将其转换为windows-1252编码的字符串:

 var string = TextDecoder("windows-1252").decode(tenc); 

要使用此function,请使用:

  

或包括这个:

 function string_transcoder (target) { this.encodeList = encodings[target]; if (this.encodeList === undefined) { return undefined; } //Initialize the easy encodings if (target === "windows-1252") { var i; for (i = 0x0; i <= 0x7F; i++) { this.encodeList[i] = i; } for (i = 0xA0; i <= 0xFF; i++) { this.encodeList[i] = i; } } } string_transcoder.prototype.transcode = function (inString) { var res = new Uint8Array(inString.length), i; for (i = 0; i < inString.length; i++) { var temp = inString.charCodeAt(i); var tempEncode = (this.encodeList)[temp]; if (tempEncode === undefined) { return undefined; //This encoding is messed up } else { res[i] = tempEncode; } } return res; }; encodings = { "windows-1252": {0x20AC:0x80, 0x201A:0x82, 0x0192:0x83, 0x201E:0x84, 0x2026:0x85, 0x2020:0x86, 0x2021:0x87, 0x02C6:0x88, 0x2030:0x89, 0x0160:0x8A, 0x2039:0x8B, 0x0152:0x8C, 0x017D:0x8E, 0x2018:0x91, 0x2019:0x92, 0x201C:0x93, 0x201D:0x94, 0x2022:0x95, 0x2013:0x96, 0x2014:0x97, 0x02DC:0x98, 0x2122:0x99, 0x0161:0x9A, 0x203A:0x9B, 0x0153:0x9C, 0x017E:0x9E, 0x0178:0x9F} }; 

测试以下脚本: