2010-04-20 12 views
3

Je développe un plugin firefox et je récupère des pages web pour faire des analyses pour l'utilisateur. Le problème est que lorsque j'essaie d'obtenir des pages (XMLHttpRequest) qui ne sont pas encodées en utf-8, la chaîne que je vois est foirée. Par exemple des pages hébreu avec windows-1125 ou des pages chinoises avec gb2312.Conversion de charsets ISO/Windows en UTF-8 en Javascript

je l'ai déjà essayé ce qui suit:

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)); 

J'ai aussi essayé escape/unescape/encodeURIComponent

des idées ???

Répondre

4

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?

+0

merci - travail ... Je suppose que vous écrivez je vais devoir chercher deux fois non-utf-8 pages ... – Amir

+0

Ajouté quelques idées sur éviter le deuxième fetch ... pas de très bonnes idées, mais potentiellement réalisable . – bobince