FR:Tutorials:Character Encoding and xajax






FR:Tutorials:Character Encoding and xajax

Contents

[edit] Introduction au codage de caractère dans xajax

Une des luttes continues avec des technologies d'Ajax traite différents ensembles de codage de caractère. L'objet XmlHttpRequest de Javascript sur lequel toute la liaison asynchrone d'Ajax repose, envoie des données seulement dans le codage UTF-8, indépendamment du jeu de caractères de votre HTML et en-têtes.

Faire fonctionner xajax facilement avec d'autres jeux de caractères que l'UTF-8 a été un défit majeur tout au long du développement. A partir de la version 0.2.3 de xajax, nous avons mis en place une fonctionnalité que nous espérons simplifiera la création et le maintien de pages à base de xajax.

La solution optimale pour l'internationalisation est que les développeurs conçoivent et créent leurs sites Web et bases de données en utilisant seulement UTF-8, sachant que UTF-8 devrait pouvoir afficher n'importe quelle langue utilisée. Par défaut le xajax emploie le codage UTF-8. Cependant, nous comprenons qu'en dépit de cet idéal, vous êtes confrontrés l'utilisation d'autres codes.

Il y a trois manières pour régler le codage de caractère que vous souhaitez que xajax utilise:

[edit] Modifier le codage de caractère par défaut

Dans le fichier xajax.inc.php, il y a une constante appelée XAJAX_DEFAULT_CHAR_ENCODING. Par défaut elle est réglée sur UTF-8. Cependant, vous pouvez la régler sur le codage de caractère dont vous voulez que xajax utilise.

//define ('XAJAX_DEFAULT_CHAR_ENCODING', 'utf-8' );
define ('XAJAX_DEFAULT_CHAR_ENCODING''ISO-8859-1' );

[edit] Réglage du codage lors de l'installation

Les constructeurs des classes xajax et xajaxResponse prend en compte les paramètres de code caractère lors de la création des instances. Ils prennent par défaut la valeur de XAJAX_DEFAULT_CHAR_ENCODING.


Les paramètres du constructeur xajax:

xajax($sRequestURI="",$sWrapperPrefix="xajax_",$sEncoding=XAJAX_DEFAULT_CHAR_ENCODING,$bDebug=false)


Les paramètres du constructeur xajaxResponse:

xajaxResponse($sEncoding=XAJAX_DEFAULT_CHAR_ENCODING, $bOutputEntities=false)


Vous pouvez preciser lors de la création de l'instance le code caractère à utiliser:

$xajax = new xajax("","xajax_",'ISO-8859-1');

Cependant, si vous créez l'instance xajax avec un code caractère donné, vous devez vous rappeler de remettre le même à xajaxResponse:

$objResponse = new xajaxResponse('ISO-8859-1');

[edit] Réglage du code caractère après la création des instances

Les classes xajax et xajaxResponse incluent une méthode setCharEncoding() qui permet de changer le code caractère après la création d'instances de ces classes:

$xajax = new xajax();
$xajax->setCharEncoding('ISO-8859-1');

Si vous utilisez la méthode setCharEncoding() pour changer le code caractère de l'objet xajax, vous devez également vous rappeler de parametrer le même codage dans vos exemples de classe de xajaxResponse. Autrement le xajax ne fonctionnera pas correctement. Vous pouvez placer le codage de xajaxResponse pendant la création de l'instance comme décrit dans la section précédente, ou en utilisant la méthode setCharEncoding() après la création de l'instance.

$objResponse = new xajaxResponse();
$objResponse->setCharEncoding('ISO-8859-1');

[edit] Si le changement de code caractère ne marche toujours pas

Si vous recevez toujours des messages d'erreur de XML inadmissible et vous employez seulement vos caractères pour montrer et pas pour le comparasion ou la manipulation (ayant l'extension mb_string installée dans PHP) vous pouvez essayer d'utiliser xajax->outputEntitiesOn ().

outputEntitiesOn() indique à l'objet réponse de convertir les caractères spéciaux en entités de HTML automatiquement, de sorte que les caractères qui ne sont pas dans votre jeu de caractères courant soient convertis. par exemple é devient é ce qui finira par afficher la même chose dans les navigateurs.

Si vous utilisez une base de donnée MySQL det que vous obtenez des réponses bizarres à vos requêtes, excecutez les commandes PHP suivantes:

mysql_query("SET NAMES 'utf8' COLLATE 'utf8_unicode_ci'");
mysql_query("SET CHARACTER SET utf8");

[edit] Questions de décodage

Même si vous utilisez les méthodes ci-dessus pour changer le code, l'objet XmlHttpRequest envoie toujours des données en UTF-8 et les valeurs des paramètres passés du Javascript aux fonctions PHP enregistrées dans xajax seront encore codées en UTF-8.

A partir de la version 0.2.3, xajax a une fonctionnalité intégrée pour décoder les données reçues d'UTF-8 vers n'importe quel codage caractère que vous utilisez. Cette fonctionnalité de décodage est désactivée par défaut. Vous pouvez l'activer en appelant la méthode decodeUTF8InputOn() de la classe xajax :

$xajax = new xajax();
$xajax->setCharEncoding('ISO-8859-1');
$xajax->decodeUTF8InputOn();

Ayant la fonctionnalité de décodage activée, xajax vérifiera les divers modules, dans votre installation PHP, qui ont la capacité de convertir le codage de caractère, et les emploie s'ils sont disponibles. S'ils ne sont pas vous recevrez un message d'erreur. Si cela fonctionne, les valeurs des paramètres reçus par vos fonctions devraient être correctement encodées pour n'importe quel codage que vous auriez fixé.

[edit] Astuces

  • Essayer d'employer UTF-8 dès que possible.
  • Si vous fixez le codage de caractère dans le constructeur de xajax ou grâce à la méthode $xajax->setCharEncoding(), rappelez-vous de le fixer pour vos instances de xajaxResponse aussi. Si vous négligez cet élément, vous obtiendrez une erreur de XML dans l'Internet Explorer.
  • Indépendamment du codage que vous avez fixé, les données arriveront de votre Javascript codé en UTF-8. Utiliser la méthode $xajax->decodeUTF8InputOn() pour permettre le décodage automatique d'UTF-8 au code caractère que vous avez fixé.

[edit] Exemple

<?php
require ('xajax.inc.php');

function testEncoding($strText)
{
        $objResponse = new xajaxResponse('ISO-8859-1');
        $objResponse->addAssign("div1","innerHTML",$strText);
    
        return $objResponse;
}

$xajax = new xajax();
$xajax->setCharEncoding('ISO-8859-1');
$xajax->decodeUTF8InputOn();

$xajax->registerFunction("testEncoding");

$xajax->processRequests();
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <?php
        $xajax->printJavascript();
    ?>
</head>

<body>
    <div id="div1"></div>

    <form id="form1" onsubmit="return false;">
        <input type="text" value="Español" id="text1" name="text1" />
        <input type="submit" value="Submit" onclick="xajax_testEncoding(xajax.$('text1').value);" />
    </form>
</form>
</body>
</html>