Ändern Sie die JavaScript-String-Kodierung

Lesezeit: 7 Minuten

Davids Benutzeravatar
David

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

Es stellte sich heraus, dass dies etwas unklarer war [the author] hatte gedacht, ja [the author] rollte schließlich [his] eigene Lösung. 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 im Array verwenden [the author] tat:

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

};

  • Danke schön! 🙂 Zufälligerweise ist dies die erste Lösung, die ich für das Problem der Kodierung der HTTP-Statusbeschreibung in NetFramework finden konnte: Response.StatusDescription kodiert in CP1252 und mein Browser versucht immer, sie als CP1251 zu dekodieren.

    – ornisch

    31. Januar 2022 um 14:28

  • Die verlinkte code.google.com/p/stringencoding Die obige Bibliothek existiert nicht mehr. Aber diese Antwort eines anderen Beitrags stackoverflow.com/a/54883467/1915920 hilft und bezieht sich möglicherweise auf seinen Nachfolger: github.com/inexorabletash/text-encoding

    – Andreas Covidiot

    28. September 2022 um 7:13 Uhr


Benutzeravatar von user2511140
Benutzer2511140

Testen Sie das folgende Skript:

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

  • Nein, das trifft nicht zu. Dies war alles eine interne Javascript-String-Kodierung (keine Literale und nicht vom Browser formatiert).

    – David

    26. Okt. 2013 um 20:44

Die beste Lösung für mich wurde hier veröffentlicht und dies ist mein Einzeiler:

<!-- Required for non-UTF encodings (quite big) -->
<script src="encoding-indexes.js"></script>

<script src="encoding.js"></script>
...
// windows-1252 is just one typical example encoding/transcoding
let transcodedString = new TextDecoder( 'windows-1252' ).decode( 
                         new TextEncoder().encode( someUtf8String ))

oder dies, wenn die Transkodierung auf mehrere Eingänge unter Wiederverwendung des Encoders und Decoders angewendet werden muss:

let srcArr = [ ... ]  // some UTF-8 string array
let encoder = new TextEncoder()
let decoder = new TextDecoder( 'windows-1252' )
let transcodedArr = srcArr.forEach( (s,i) => { 
                      srcArr[i] = decoder.decode( encoder.encode( s )) })

(Die leicht modifizierte andere Antwort aus der verwandten Frage:)

Dies habe ich nach einer spezifischeren Google-Suche als nur UTF-8-Kodierung/Dekodierung gefunden. Wer also nach einer Konvertierungsbibliothek zum Konvertieren zwischen Kodierungen sucht, ist hier genau richtig.

github.com/inexorabletash/text-encoding

var uint8array = new TextEncoder().encode(str);
var str = new TextDecoder(encoding).decode(uint8array);

Aus der Repo-Readme-Datei einfügen

Alle Kodierungen aus der Encoding-Spezifikation werden unterstützt:

utf-8 ibm866 iso-8859-2 iso-8859-3 iso-8859-4 iso-8859-5 iso-8859-6 
iso-8859-7 iso-8859-8 iso-8859-8-i iso-8859-10 iso-8859-13 iso-8859-14 
iso-8859-15 iso-8859-16 koi8-r koi8-u macintosh windows-874 windows-1250 
windows-1251 windows-1252 windows-1253 windows-1254 windows-1255 
windows-1256 windows-1257 windows-1258 x-mac-cyrillic gb18030 hz-gb-2312 
big5 euc-jp iso-2022-jp shift_jis euc-kr replacement utf-16be utf-16le 
x-user-defined

(Einige Kodierungen werden möglicherweise unter anderen Namen unterstützt, z. B ascii,
iso-8859-1usw. Weitere Bezeichnungen für jede Kodierung finden Sie unter Kodierung.)

1451440cookie-checkÄndern Sie die JavaScript-String-Kodierung

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy