3 Stimmen

Konvertierung von ISO/Windows-Zeichensätzen in UTF-8 in Javascript

Ich entwickle ein Firefox-Plugin und rufe Webseiten ab, um einige Analysen für den Benutzer durchzuführen. Das Problem ist, wenn ich versuche, (XMLHttpRequest) Seiten zu erhalten, die nicht utf-8 kodiert sind die Zeichenfolge, die ich sehe, ist durcheinander. Zum Beispiel hebräische Seiten mit Windows-1125 oder chinesische Seiten mit gb2312.

Ich habe bereits Folgendes versucht:

var uDecoder=Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].getService(Components.interfaces.nsIScriptableUnicodeConverter);
uDecoder.charset="windows-1255";
alert( xhr.responseText );

var decoder=Components.classes["@mozilla.org/intl/utf8converterservice;1"].getService(Components.interfaces.nsIUTF8ConverterService);

alert(decoder.convertStringToUTF8(xhr.responseText,"WINDOWS-1255",true)); 

Ich habe auch versucht escape/unescape/encodeURIComponent

Irgendwelche Ideen???

4voto

bobince Punkte 512550

Sobald XMLHttpRequest versucht hat, eine Nicht-UTF-8-Zeichenkette mit UTF-8 zu dekodieren, haben Sie bereits verloren. Die Byte-Sequenzen in der Seite, die keine gültigen UTF-8-Sequenzen waren, wurden verstümmelt (normalerweise in , das Ersatzzeichen U+FFFD). Keine noch so gute Neukodierung/Dekodierung wird sie zurückbringen.

Seiten, die eine Content-Type: text/html;charset=something HTTP-Header sollte OK sein. Seiten, die keinen echten HTTP-Header haben, aber einen <meta> Version nicht sein wird, weil XMLHttpRequest weiß nicht, wie HTML geparst wird, so dass es die Metadaten nicht sehen wird. Wenn Sie im Voraus wissen, welchen Zeichensatz Sie wollen, können Sie sagen XMLHttpRequest und es wird sie benutzen:

xhr.open(...);
xhr.overrideMimeType('text/html;charset=gb2312');
xhr.send();

(Dies ist eine derzeit nicht standardisierte Erweiterung von Mozilla).

Wenn Sie den Zeichensatz nicht im Voraus kennen, können Sie die Seite einmal anfordern, mit dem Header für eine <meta> Zeichensatz, parsen Sie diesen aus und fordern Sie ihn mit dem neuen Zeichensatz erneut an.

Theoretisch könnte man mit einer einzigen Anfrage eine binäre Antwort erhalten:

xhr.overrideMimeType('text/html;charset=iso-8859-1');

und konvertieren diese dann von Bytes-als-Zeichen nach UTF-8. Wie auch immer, iso-8859-1 würde hier nicht funktionieren, da der Browser diesen Zeichensatz interpretiert als wirklich die Windows-Code-Seite 1252.

Man könnte vielleicht einen anderen Zeichensatz verwenden, der jedes Byte auf ein Zeichen abbildet, und eine Menge mühsamer Zeichenersetzungen vornehmen, um jedes Zeichen in diesem Zeichensatz auf das Zeichen abzubilden, das es in real-ISO-8859-1 gewesen wäre, und dann die Konvertierung vornehmen. Die meisten Kodierungen bilden nicht ab jede Byte, aber Arabisch (cp1256) könnte ein Kandidat dafür sein?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X