更改JavaScript字符串编码

更改JavaScript字符串编码,javascript,jquery,string,encoding,Javascript,Jquery,String,Encoding,目前,我有一个很大的JavaScript字符串,我正试图写入一个文件,但编码方式不同(ISO-8859-1)。我希望用类似的东西。Downloadify只接受普通JavaScript字符串或base64编码字符串 因此,我决定压缩我的字符串,使用它生成一个很好的base64编码字符串,可以传递给downloadify,并下载到我的桌面。胡萨!问题是,我压缩的字符串,当然,仍然是错误的编码 幸运的是,JSZip可以将Uint8Array作为数据,而不是字符串。那么,有没有办法将JavaScript

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

因此,我决定压缩我的字符串,使用它生成一个很好的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只接受字符串、arraybuffers或UInt8Array)

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


这比我想象的要模糊一些,所以我最终推出了自己的解决方案。它的健壮性不如合适的解决方案,但它会将JavaScript字符串转换为windows-1252编码,并将其固定在Uint8Array中:

var enc = new string_transcoder("windows-1252");
var tenc = enc.transcode(result); //This is now a 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编码字符串:

要使用此功能,请使用:

<script src="//www.eu4editor.com/string_transcoder.js"></script>
<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}     

};
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}     

};
函数字符串\u转码器(目标){
this.encodeList=编码[目标];
if(this.encodeList==未定义){
返回未定义;
}
//初始化简单编码
如果(目标==“windows-1252”){
var i;

对于(i=0x0;i来说,这比[作者]想象的要模糊一些,因此[作者]最终推出了[他]自己的解决方案。它几乎没有合适的解决方案那么健壮,但它会将JavaScript字符串转换为windows-1252编码,并将其粘贴在Uint8Array中:

var enc = new string_transcoder("windows-1252");
var tenc = enc.transcode(result); //This is now a 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编码字符串:

要使用此功能,请使用:

<script src="//www.eu4editor.com/string_transcoder.js"></script>
<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}     

};
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}     

};
函数字符串\u转码器(目标){
this.encodeList=编码[目标];
if(this.encodeList==未定义){
返回未定义;
}
//初始化简单编码
如果(目标==“windows-1252”){
var i;

对于(i=0x0;i测试以下脚本:

<script type="text/javascript" charset="utf-8">


不是类似于
utfstring=unescape(encodeURIComponent(originalstring))
work?不幸的是没有。我的目标是在将最终文件视为ISO-8859-1时看到“Île”。在正常写入文件时,它将作为UCS-2写入,这将在视为ISO-8859-1时导致“ÃŽle”。使用您的方法时,它将导致“ÃŽle”。这与建议的副本不同,因为我不要求浏览器显示这样做,并因此更改HTML5元标记并不能解决问题。你回答了你自己的问题吗?还是我遗漏了什么?是的,我回答了。它被错误地作为副本关闭,我不想让它挂在那里不回答。@David:如果编辑是答案,请将其作为一个(你可以接受)发布不,这不适用。这是所有内部javascript字符串编码(不是文字,也不是由浏览器格式化)。