Im Moment habe ich eine große JavaScript-Zeichenfolge, die ich in eine Datei schreiben möchte, allerdings in einer anderen Codierung (ISO-8859-1). Ich hatte gehofft, so etwas zu verwenden herunterladen. Downloadify akzeptiert nur normale JavaScript-Strings oder Base64-codierte Strings.
Aus diesem Grund habe ich beschlossen, meine Zeichenfolge mit zu komprimieren JSZip Dadurch wird eine schön Base64-codierte Zeichenfolge generiert, die an downloadify übergeben und auf meinen Desktop heruntergeladen werden kann. Huzzah! Das Problem ist, dass die von mir komprimierte Zeichenfolge natürlich immer noch die falsche Codierung aufweist.
Glücklicherweise kann JSZip ein Uint8Array anstelle einer Zeichenfolge als Daten verwenden. Gibt es also eine Möglichkeit, einen JavaScript-String in einen ISO-8859-1-codierten String zu konvertieren und ihn in einem Uint8Array zu speichern?
Gibt es alternativ eine insgesamt bessere Lösung, wenn ich das Ganze falsch angehe? Gibt es eine ausgefallene JavaScript-String-Klasse, die verschiedene interne Codierungen verwenden kann?
Bearbeiten: Zur Klarstellung: Ich schiebe diese Zeichenfolge nicht auf eine Webseite, sodass sie nicht automatisch für mich konvertiert wird. Ich mache so etwas:
var zip = new JSZip();
zip.file("genSave.txt", result);
return zip.generate({compression:"DEFLATE"});
Und damit dies einen Sinn ergibt, muss das Ergebnis die richtige Codierung aufweisen (und JSZip akzeptiert nur Strings, Arraybuffer oder uint8arrays).
Letzte Bearbeitung (Dies war keine doppelte Frage, da das Ergebnis nicht im Browser angezeigt oder an einen Server übertragen wurde, auf dem die Kodierung geändert werden konnte):
Das stellte sich als etwas unklarer heraus, als ich gedacht hatte, also habe ich schließlich meine eigene Lösung gefunden. Es ist nicht annähernd so robust wie eine richtige Lösung, aber es konvertiert einen JavaScript-String in die Windows-1252-Codierung und speichert ihn in einem Uint8Array:
var enc = new string_transcoder("windows-1252");
var tenc = enc.transcode(result); //This is now a Uint8Array
Sie können es dann entweder wie ich im Array verwenden:
//Make this into a zip
var zip = new JSZip();
zip.file("genSave.txt", tenc);
return zip.generate({compression:"DEFLATE"});
Oder konvertieren Sie es mit in eine Windows-1252-codierte Zeichenfolge diese String-Kodierungsbibliothek:
var string = TextDecoder("windows-1252").decode(tenc);
Um diese Funktion zu verwenden, verwenden Sie entweder:
<script src="https://www.eu4editor.com/string_transcoder.js"></script>
Oder fügen Sie Folgendes hinzu:
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}
};
Möchte so etwas nicht
utfstring = unescape(encodeURIComponent(originalstring));
arbeiten?– Joren
18. September 2013 um 18:44 Uhr
Leider nicht. Mein Ziel ist es, „Île“ zu sehen, wenn ich die endgültige Datei als ISO-8859-1 ansehe. Beim normalen Schreiben wird die Datei als UCS-2 geschrieben, was bei der Betrachtung als ISO-8859-1 zu „Üle“ führt. Wenn Sie Ihre Methode verwenden, ergibt sich „Île“. Dies ist nicht das gleiche Problem wie das vorgeschlagene Duplikat, da ich den Browser nicht auffordere, dies anzuzeigen, und eine Änderung des HTML5-Meta-Tags daher das Problem nicht lösen wird.
– David
18. September 2013 um 19:05 Uhr
Haben Sie Ihre eigene Frage beantwortet? oder übersehe ich etwas?
– Enigmadan
18. September 2013 um 22:31 Uhr
Ja hab ich. Es wurde fälschlicherweise als Duplikat geschlossen und ich wollte es nicht unbeantwortet dort hängen lassen.
– David
18. September 2013 um 23:08 Uhr
@David: Wenn diese Änderung eine Antwort war, setzen Sie sie bitte zurück und veröffentlichen Sie sie als Selbstantwort (die Sie dann akzeptieren können).
– Bergi
18. September 2013 um 23:55 Uhr