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?