Changement JavaScript de codage de la chaîne

Pour le moment j'ai un grand JavaScript chaîne, je suis d'essayer d'écrire dans un fichier, mais dans un autre encodage (ISO-8859-1). J'espérais utiliser quelque chose comme downloadify. Downloadify accepte uniquement JavaScript normale des cordes ou des chaînes codées en base64.

À cause de cela, j'ai décidé de compresser ma chaîne à l'aide de JSZip qui génère un bien encodé en base64 chaîne de caractères qui peut être transmis à downloadify, et téléchargé 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 un Uint8Array que des données, au lieu d'une chaîne. Donc, est-il possible de convertir un JavaScript chaîne en ISO-8859-1 chaîne codée et de le stocker dans un Uint8Array?

Sinon, si j'aborde ce tout faux, est-il une meilleure solution tous ensemble? Est-il une fantaisie JavaScript classe string qui peut utiliser différents codages?

Edit: Pour préciser, je ne suis pas d'appuyer sur cette chaîne à une page web afin de ne pas convertir 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 ce qui est logique, j'aurais besoin de raison d'être dans le bon encodage (et JSZip ne prend que des chaînes, arraybuffers, ou uint8arrays).

Montage Final (C'est -pas - une double question, parce que le résultat n'était pas affichée dans le navigateur ou transmises à un serveur où l'encodage susceptibles d'être modifiés):

Cela s'est avéré pour être un peu plus obscur que je le pensais, j'ai donc fini par rouler ma propre solution. Il n'est pas aussi robuste qu'une bonne solution serait, mais il va convertir un JavaScript chaîne en windows-1252 encodage, et de la coller 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 de le convertir en windows-1252 chaîne codée à l'aide de ce codage de la chaîne de la bibliothèque:

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

Pour utiliser cette fonction, soit utiliser:

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

Ou les inclure:

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}     
};
  • Ne serait pas quelque chose comme utfstring = unescape(encodeURIComponent(originalstring)); travail?
  • Malheureusement pas. Mon but est de voir 'l'Île' lors de la visualisation du fichier final, comme ISO-8859-1. Lors de l'écriture du fichier, normalement, il écrit UCS-2 résultats en "ÃŽle' lorsqu'on la considère comme ISO-8859-1. Lors de l'utilisation de votre méthode, il en résulte 'Île'. Ce n'est pas le même problème que le projet de reproduire comme je ne suis pas demander au navigateur d'afficher ce, et modifiant ainsi le HTML5, la balise meta ne résoudra pas le problème.
  • Vous avez répondu à votre propre question? ou ai-je raté quelque chose?
  • Ouais, je l'ai fait. Il a été mal fermé comme un doublon et je ne voulais pas le laisser accroché là sans réponse.
  • Si cette modification était de répondre, veuillez vous rollback c', et il poste en tant que auto-réponse (que vous pouvez accepter à l'époque)
  • Avez-vous essayer avec le charset attribut de la script élément? w3.org/TR/html401/interact/scripts.html#h-18.2.1

InformationsquelleAutor David | 2013-09-18