Modifier le codage de chaîne JavaScript

pour le moment, j'ai une chaîne JavaScript que j'essaie d'écrire dans un fichier, mais dans un encodage différent (ISO-8859-1). J'espérais utiliser quelque chose comme downloadify. Downloadify accepte uniquement les chaînes JavaScript normales ou Base64 encoded strings.

A cause de cela, j'ai décidé de compresser ma corde en utilisant JSZip qui génère une chaîne encodée base64 qui peut être passée à downloadify, et téléchargée sur mon bureau. Huzzah! Le problème est que la chaîne que j'ai compressé, bien sûr, est toujours le mauvais encodage.

heureusement JSZip peut prendre Uint8Array comme données, au lieu d'une chaîne de caractères. Donc, y a-t-il un moyen de convertir une chaîne JavaScript en une chaîne codée ISO-8859-1 et de la stocker dans un Uint8Array?

alternativement, si j'aborde tout cela de Travers, y a-t-il une meilleure solution? Y a-t-il une classe de chaîne de caractères JavaScript qui peut utiliser différents encodages internes?

Modifier: To clarifiez, Je ne pousse pas cette chaîne de caractères sur une page Web pour qu'elle ne la convertisse pas automatiquement pour moi. Je suis en train de faire quelque chose comme ceci:

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

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

et pour que cela ait du sens, j'aurais besoin que le résultat soit dans le bon encodage (et JSZip ne prend que les chaînes, les tableaux, ou uint8arrays).

édition finale (il ne s'agissait pas d'une question dupliquée parce que le résultat n'était pas affiché dans le navigateur ou transmis à un serveur où l'encodage pourrait être changé):

cela s'est avéré être un peu plus obscur que je pensais, donc j'ai fini par mettre au point ma propre solution. Il n'est pas aussi robuste qu'une solution appropriée le serait, mais il convertira une chaîne JavaScript en encodage windows-1252, et le collera dans un Uint8Array:

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

Vous pouvez ensuite l'utiliser dans le tableau comme je l'ai fait:

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

ou convertissez-le en une chaîne encodée windows-1252 en utilisant cette chaîne encodant bibliothèque:

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

Pour utiliser cette fonction, utilisez:

<script src="//www.eu4editor.com/string_transcoder.js"></script>

Ou inclure ceci:

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}     

};
18
demandé sur David 2013-09-18 22:39:13

2 réponses

Cela s'est avéré pour être un peu plus obscur que [l'auteur] a, [l'auteur] a fini par rouler [sa] propre solution. Il n'est pas aussi robuste qu'une solution appropriée le serait, mais il convertira une chaîne JavaScript en encodage windows-1252, et le collera dans un Uint8Array:

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

Vous pouvez ensuite l'utiliser dans le tableau comme [l'auteur] a:

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

ou convertissez-le en une chaîne encodée windows-1252 en utilisant cette chaîne encodant bibliothèque:

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

Pour utiliser cette fonction, utilisez:

<script src="//www.eu4editor.com/string_transcoder.js"></script>

Ou inclure ceci:

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}     

};
3
répondu Nate 2013-09-27 15:03:18

Tester le script suivant:

<script type="text/javascript" charset="utf-8">
1
répondu user2511140 2013-10-22 20:41:45