Une fois que XMLHttpRequest
a essayé de décoder une chaîne non-UTF-8 en utilisant UTF-8, vous avez déjà perdu. Les séquences d'octets de la page qui n'étaient pas des séquences UTF-8 valides auront été mutilées (généralement converties en �
, le caractère de remplacement U + FFFD). Aucune quantité de ré-encodage/décodage ne les récupèrera.
Les pages qui spécifient un en-tête HTTP Content-Type: text/html;charset=something
devraient être OK. Les pages qui n'ont pas d'en-tête HTTP réel mais qui ont une version <meta>
ne le seront pas, car XMLHttpRequest
ne sait pas comment analyser le code HTML pour qu'il ne voie pas la méta. Si vous connaissez à l'avance le jeu de caractères que vous voulez, vous pouvez dire XMLHttpRequest
et il va l'utiliser:
xhr.open(...);
xhr.overrideMimeType('text/html;charset=gb2312');
xhr.send();
(Ceci est une extension Mozilla actuellement non standardisée.)
Si vous ne connaissez pas le charset à l'avance, vous pouvez demander la page une fois, pirater avec l'en-tête pour un jeu de caractères <meta>
, analyser cela et demander à nouveau avec le nouveau jeu de caractères.
En théorie, vous pourriez obtenir une réponse binaire dans une seule requête:
xhr.overrideMimeType('text/html;charset=iso-8859-1');
puis convertir que d'octets-en-caractères UTF-8. Cependant, iso-8859-1
ne fonctionnerait pas pour cela parce que le navigateur interprète que charset comme vraiment être la page de code Windows 1252.
Vous pourriez peut-être utiliser un autre codepage qui associe chaque octet à un personnage, et faire une charge de caractère fastidieux remplacements pour mapper tous les caractères de cette page de codes au caractère qu'il aurait été en réel-ISO-8859-1, puis faire la conversion. La plupart des codages ne correspondent pas tous les octets, mais l'arabe (cp1256) pourrait être un candidat pour cela?
merci - travail ... Je suppose que vous écrivez je vais devoir chercher deux fois non-utf-8 pages ... – Amir
Ajouté quelques idées sur éviter le deuxième fetch ... pas de très bonnes idées, mais potentiellement réalisable . – bobince