Изменение кодировки строки JavaScript

В настоящий момент у меня есть большая строка JavaScript, которую я пытаюсь записать в файл, но в другой кодировке (ISO-8859-1). Я надеялся использовать что-то вроде downloadify. Downloadify принимает только обычные строки JavaScript или строки с кодировкой base64.

Из-за этого я решил сжать свою строку, используя JSZip, которая генерирует красивую строку с кодировкой base64, которая может быть передана загружать и загружать на рабочий стол. Ура! Проблема в том, что сжатая строка, конечно же, по-прежнему является неправильной кодировкой.

К счастью, JSZip может использовать Uint8Array в качестве данных вместо строки. Итак, есть ли способ конвертировать строку JavaScript в кодированную строку ISO-8859-1 и хранить ее в Uint8Array?

В качестве альтернативы, если я подхожу к этому, все неправильно, есть ли лучшее решение для всех вместе? Есть ли фантастический стиль строки JavaScript, который может использовать разные внутренние кодировки?

Изменить: Чтобы уточнить, я не нажимаю эту строку на веб-страницу, поэтому она не будет автоматически конвертировать ее для меня. Я делаю что-то вроде этого:

var zip = new JSZip();
zip.file("genSave.txt", result);

return zip.generate({compression:"DEFLATE"});

И для этого, чтобы иметь смысл, мне нужен результат, чтобы быть в правильной кодировке (и JSZip принимает только строки, массивы или uint8arrays).

Final Edit (Это был не двойной вопрос, потому что результат не отображался в браузере или не передавался на сервер, где можно было изменить кодировку):

Это оказалось немного более неясным, чем я думал, поэтому я закончил свое собственное решение. Это не так просто, как правильное решение, но оно преобразует строку 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);

Чтобы использовать эту функцию, используйте:

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

};

Ответы

Ответ 1

Это оказалось немного более неясным, чем думал [автор], поэтому [автор] закончил свое собственное решение. Это не так просто, как правильное решение, но оно преобразует строку 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);

Чтобы использовать эту функцию, используйте:

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

};

Ответ 2

Проверьте следующее script:

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