UTF-8, Ajax et IE6

Posté par $Francois pro

 

Si il y a bien un sujet sur lequel on peut blogger a en perdre haleine, c'est bien UTF-8. Non pas que je n'aime pas l'UTF-8 et ses déclinaisons, il sauve des vies en matière d'i18n. Mais Dieu sait s'il réclame régulièrement son lot de vie de programmeur.

Pourtant la faucheuse dans ce cas-ci n'est pas la norme en elle-même mais plutôt les multiples implémentations par nos fournisseurs logiciels favoris.

Pourquoi ce sujet au départ d'ailleurs ? Parce que je me suis retrouvé le nez bien enfoncé dans un debugger VS.NET attaché à un iexplore.exe sur base du schéma suivant: un tchat style "shoutbox" qui récupère les lignes de tchat via des requêtes longues Ajax a-la-Comet sur un bus de messaging ActiveMQ.

Le contenu des messages est en UTF-8, tout fonctionne correctement sous FireFox mais régulièrement rien ne s'affiche sous IE6. Comment debugger çà ?

Déjà il y a le mythe qu'il n'y a pas de debugger Javascript correct sous IE6.

Sous Firefox, il y a le sublime Firebug et le vénérable et un peu poussif mais parfois encore utile Venkman. Sous IE, à part les boites de dialogues d'erreur Javascript, il n'y a rien. Faux. S'il n'y a rien dans IE, c'est parce que toute la partie de debugging Javascript a été externalisée dans un environnement bien connu des développeurs papillon: VS.NET.

Naïvement je me suis dis que la version Express de Visual Studio qui est gratuite devait permettre cette fonctionnalité. Pas exactement. La fonction permettant de s'attacher à un process iexplore.exe a été enlevée et on ne peut debugger que des projets ASP.NET réalisé avec Web Express. Ah bon?

Première étape, le debugger du pauvre qui s'appele "Script Debugger" et qui date de 1997. Il a une délicieuse interface MDI qui vous rend nostalgique du Visual Basic en quelques secondes. Mais au moins il est gratuit.

On commence par activer le deboggage externe dans les options:

Activation Deboggage IE6

Ensuite via le menu Affichage->Deboggage de Script, on lance le Script Debugger. Résultat, c'est inutilisable. On peut voir le source, la stack, poser des breakpoints mais il n'y a rien pour voir facilement le contenu des variables. Il y a juste une fenêtre "Command" dans lequel on peut taper des commandes Javascript pour "afficher" le contenu des variables. J'entends par là faire des "alert()". Passons et cherchons autre chose.

On me conseille ensuite de regarder le "Script Editor" qui livré avec Office 2003/XP. Ca tombe bien j'ai eu la bonne idée d'installer un Office sur mon PC (le compagnon idéal du hardcore developer). L'icone de MSE est celle de Visual Studio, on est sur la bonne piste! Et effectivement, je n'en reviens pas c'est le debugger de Visual Studio la fonctionnalité permettant de s'attacher à n'importe quel process dont iexplore.exe!
La fonction manquante de Visual Studio Web Express:

Microsoft Script Editor

On peut égaler l'appeler directement depuis IE via Affichage->Deboggeur de Script à condition d'avoir au moins lancé une fois Microsoft Script Editor une fois et d'avoir choisi "Installer le deboggage Web" dans le menu Deboggage. (Il est nécessaire d'avoir désinstallé Microsoft Script Debbugger avant de tenter cette manipulation)

On ajoute un breakpoint manuellement au début du fichier amq.js, ensuite un autre breakpoint précisement sur la partie XHR et on termine avec un "espion" sur request.responseXML.parseError. Un coup de F5 et nous voici au coeur du problème:

Breakpoint et Espion

- request.responseXML.parseError {...} Object
errorCode -1072896760 Long
reason "Un caractère incorrect a été trouvé dans un contenu de texte.
" String
srcText "1

Avec le parsing qui s'arrête net sur le premier caractère accentué UTF-8 de la réponse XML Ajax. Pourquoi IE refuse de faire le parsing de l'UTF8 dans ce message ? A cause du header HTTP Content-Type renvoyé par le serveur de servlets:

HTTP/1.1 200 OK
Date: Thu, 21 Dec 2006 17:29:40 GMT
Server: Apache-Coyote/1.1
Cache-Control: no-cache
Content-Type: text/xml;charset=ISO-8859-1
Content-Length: 269
Connection: close
1

Et oui. Si le charset n'est pas UTF-8, IE refuse de parser du UTF-8 dans les réponses XHR.

Pourtant le header de la requête HTTP le spécifait bien:

POST /activemq-web-console/amq HTTP/1.1
Accept: text/javascript, text/html, application/xml, text/xml, */*
x-prototype-version: 1.5.0_rc1
x-requested-with: XMLHttpRequest
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Host: localdev
Content-Length: 108
destination=topic://SHENZHOU.FEED?timeout=3&message=feeditem&type=listen&poll=true

L'erreur vient ici de la servlet AJAX de ActiveMQ qui ne précise aucun encodage spécifique lors de ces réponses et donc c'est le charset par défaut, soit iso-8859-1, qui est renvoyé par Tomcat.

J'ai résolu mon problème en recompilant la Servlet AJAX de ActiveMQ avec quelques setContentType('text/xml; charset=utf-8'); mais ca ne me parait pas très flexible.

Je n'ai pas trouvé dans la configuration de settings globale pour changer l'encodage par défaut de Tomcat. (si quelqu'un sait, qu'il parle!)

Moralité: Dans ce cas précis, IE est plus respectueux de la norme que FireFox qui parse allégrement le message malgré un conflit entre l'encodage précise et le contenu. Autrement dit j'ai été médisant avant de débugger le problème en profondeur. J'aurais au moins appris à debugger du javascript sous IE6, cette journée n'est pas donc perdue. Hmm.
Et si vous voulez voir le fruit des efforts au final: http://www.shenzhou.be/live


 

Notre plan Réveillon de Nouvel An c'était une bonne bouffe à l'appart puis sortir en soirée.

Après avoir passé en revue les différentes possibilités sur ParisBouge, c'est devenu évident.. Cette nouvelle année serait Années 80 bien-sûr!

Des différentes soirées années 80 proposées, celle qui a retenu notre attention c'est la soirée Ultra aux Caves Saint-Sabin.

D'abord à cause de la réputation lue ici et là des soirées Ultra ensuite parce que les Caves sont du côté de République (Métro Chemin Vert Ligne 8) c'est à dire facilement accessible en métro de chez nous. Et finalement à cause du prix totalement raisonnable et accessible de 35€/personne + 2 consos en prévente (consos voulant dire absolument tout y compris flute de champagne). On a pris les préventes en ligne à imprimer soi-même via Digiclick (oui on est comme ca nous)

Nous arrivons aux Caves vers 0:40 (début officiel de la soirée à 23H, il y avait un buffet médiéval à volonté avant)

Alors, le quartier n'a rien de craignos en soi, c'est déjà ca. A l'entrée la sécurité présente mais relax. Pas de problèmes à la caisse avec la prévente imprimée (prevoir une pièce d'identité) ni de file, il semble que tout le monde soit arrivé avant nous. Pas de file non plus au vestiaire (2€ par article).

Un petit tour rapide du propriétaire. Les caves sont divisées en une multitude de petites caves toutes voutées ce qui donne un certain charme à l'endroit (et une bonne raison de regarder où je mets ma tête...). On y trouve un grand bar accessible via 2 caves séparées, des petits alcoves pour discuter plus tranquille (ou plus si affinité) et la cave de dance, bondée quand nous arrivons. L'ambiance est relax sans trop de chichi, les demoiselles sont bien habillées et les messieurs comme des sacs à papatte (comme de bienentendu)

Nous décidons que nous devons tester le bar immédiatement. Comme dit ci dessus, les consos offertes donnent droit à tout. Je teste le champagne et Jenny analyse la Despérados. Sympa, il y a des bancs partout dans toutes les caves, on peut s'y poser sans trop de difficulté, il y a un bon roulement.

Une fois équilibré au niveau liquide, on se lance dans la bataille. Il y a du monde mais encore de quoi se bouger sans trop de bousculade. La sono est bien repartie sur la longueur de la cave, ca ne va pas trop fort, on peut même s'entender si on se parle!

Niveau musique, rien à dire, c'est sans concession, c'est 100% Années 80 (francophone et anglophone) avec une sélection bien éclectique. J'ai juste entendu un morceau d'italo disco perdu à un moment. Ca doute pour voir si tout le monde suit bien Face-wink

Note pour les demoiselles: le sol des caves ait fait de dalles en pierre relativement plat mais pas tout à fait lisse, éviter les talons hauts Face-smile

On a honnetement pas vu le temps passer, on a décolé vers 5h30 pour attraper le premier métro et rentrer à la base.

La suite? Et bien les soirées Ultra ont lieu tous les mois et il me semble intéressant d'y retourner voir ce que ca donne en dehors des fêtes.

En résumé:
- Endroit: Très sympa et bien aménagé, facile d'accès
- Bar: Conso à prix très honnête, bon choix
- Musique: Rien à dire, 100% 80
- Ambiance: Sans chichi et sans problèmes