目前,我有一个很大的JavaScript字符串,我正在尝试写入一个文件,但是使用了不同的编码(ISO-8859-1)。我希望使用像downloadify这样的东西。Downloadify仅接受普通JavaScript字符串或base64编码字符串。
正因为如此,我决定使用JSZip压缩我的字符串,它生成一个漂亮的base64编码字符串,可以传递给downloadify,并下载到我的桌面上。太棒了!当然,问题是我压缩的字符串仍然是错误的编码。
幸运的是,JSZip可以接受Uint8Array作为数据,而不是字符串。那么,有没有办法将JavaScript字符串转换为ISO8859-1编码的字符串并将其存储在Uint8Array中呢?
或者,如果我处理这一切都错了,有没有更好的解决方案?有没有一个奇特的JavaScript字符串类可以使用不同的内部编码?
编辑:为了澄清,我不会将这个字符串推送到网页上,所以它不会自动为我转换它。我正在做这样的事情:
var zip = new JSZip();
zip.file("genSave.txt", result);
return zip.generate({compression:"DEFLATE"});
要使这有意义,我需要result采用正确的编码(并且JSZip只接受字符串、数组缓冲区或uint8arrays)。
最终编辑(这不是一个重复的问题,因为结果没有在浏览器中显示,也没有传输到可以更改编码的服务器):
事实证明,这比我想象的要模糊一些,所以我最终推出了我自己的解决方案。它并不像正确的解决方案那样健壮,但它会将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"});
或者使用this string encoding library将其转换为windows-1252编码字符串
var string = TextDecoder("windows-1252").decode(tenc);
要使用此函数,请使用:
<script src="//www.eu4editor.com/string_transcoder.js"></script>
或者包含以下内容:
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}
};
发布于 2013-09-27 15:03:19
事实证明,这比作者想象的更加晦涩难懂,所以作者最终提出了自己的解决方案。它并不像正确的解决方案那样健壮,但它会将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"});
或者使用this string encoding library将其转换为windows-1252编码字符串
var string = TextDecoder("windows-1252").decode(tenc);
要使用此函数,请使用:
<script src="//www.eu4editor.com/string_transcoder.js"></script>
或者包含以下内容:
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}
};
发布于 2013-10-22 19:37:24
测试以下脚本:
<script type="text/javascript" charset="utf-8">
https://stackoverflow.com/questions/18879860
复制