PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 30-01-2010 19:43:20

moijhd
Membre
Inscription : 13-06-2009
Messages : 167

Xml et accents

Bonsoir,

Lorsque dans un fichier Xml je mets entre deux balises du contenu avec un accent, lorsque je parse le fichier j'obtiens deux fois le déclenchement du gestionnaire de texte, alors que je voudrais qu'il ne se déclenche qu'une seule fois

[code php]
<?php
// Gestionnaire de texte
xml_set_character_data_handler($this->Parser, "CData");
?>
[/code]

L'encodage est UTF-8.

De même, lorsque j'essaie de remplacer les accents par leur equivalent "é" la lecture s'arrète carrément.

Pouvez-vous m'expliquer pourquoi ?

Merci

Hors ligne

#2 30-01-2010 19:59:27

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : Xml et accents

Quelle est l'entête de ton fichier xml ?

Hors ligne

#3 30-01-2010 20:05:19

moijhd
Membre
Inscription : 13-06-2009
Messages : 167

Re : Xml et accents

<?xml version="1.0" encoding="UTF-8" ?>

Je l'ai choisi un peu par défaut et que jusuq'à présent, je m'arrange pour que mes bases de données et que tout le reste soit en utf8.

Hors ligne

#4 30-01-2010 20:09:03

moijhd
Membre
Inscription : 13-06-2009
Messages : 167

Re : Xml et accents

Structure (à titre d'exemple de mon fichier) :

<?xml version="1.0" encoding="UTF-8" ?>
<membres>
<membre>
<id>1</id>
<nom>Nom 1</nom>
<prenom>Prénom 1</prenom>
</membre>
<membre>
<id>2</id>
<nom>Nom 2</nom>
<prenom>Prenom 2</prenom>
</membre>
<membre>
<id>3</id>
<nom>Nom 3</nom>
<prenom>Prenom 3</prenom>
</membre>
</membres>

Structure de ma classe XML :

[code php]
<?php
class Xml{

    // VARS
   
    public $Parser;
    public $CourrentLevel = 0;
    public $Structure = array();
   
    // CONST
   
    const CHARSET = 'UTF-8';
   
    // FUNC
   
    // On initialise
    public function __construct(){
        // On crée un nouveau parser avec un charset
        $this->Parser = xml_parser_create(self::CHARSET);
        // On convertit le parser en objet
        xml_set_object($this->Parser, $this);
        // On ajoute des options
         xml_parser_set_option($this->Parser, XML_OPTION_CASE_FOLDING, false);
         xml_parser_set_option($this->Parser, XML_OPTION_SKIP_WHITE, 1);
         xml_parser_set_option($this->Parser, XML_OPTION_TARGET_ENCODING, self::CHARSET);
        // Gestionnaire de balise
        xml_set_element_handler($this->Parser, "TagOpen", "TagClose");
        // Gestionnaire de texte
        xml_set_character_data_handler($this->Parser, "CData");
    }

    // Déclenche l'analyse du fichier
    public function Parse($Data){
        // Lance l'analyse
        xml_parse($this->Parser, $Data);
    }

    // Gere les balises ouvrantes
    // $Tag contient le nom du tag
    // $Attributes est l'array des attributs
    public function TagOpen($Parser, $Tag, $Attributes){
        C('TAG O : '.$Tag);
        C('ATTRIBUTS : ');
        C($Attributes);
        $Tab = array(
            'TagO' => $Tag,
            'Attributs' => $Attributes,
            'Level' => $this->CourrentLevel
            );
        array_push($this->Structure, $Tab);
        $this->CourrentLevel++;
    }

    // Gere le texte
    public function CData($Parser, $CData){
        C('DATA : '.$CData);
        $Tab = array(
            'Data' => $CData,
            'Level' => $this->CourrentLevel
            );
        array_push($this->Structure, $Tab);
    }

    // Gere les balises fermantes
    public function TagClose($Parser, $Tag){
        $this->CourrentLevel--;
        C('TAG F : '.$Tag);
        $Tab = array(
            'TagF' => $Tag,
            'Level' => $this->CourrentLevel
            );
        array_push($this->Structure, $Tab);
       
    }
}
?>
[/code]

On pourra critiquer le tout tongue
PS : on ignorera les C('xxxx') qui sont des echo améliorés

Dernière modification par moijhd (30-01-2010 20:09:56)

Hors ligne

#5 31-01-2010 08:42:09

moijhd
Membre
Inscription : 13-06-2009
Messages : 167

Re : Xml et accents

Mon problème ici est que "Prénom 1" est reconnu sous la forme de "Pr" puis de "énom 1"

Hors ligne

#6 31-01-2010 09:24:17

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : Xml et accents

Je ne saurais pas résoudre ton problème.
Cependant en tentant de chercher j'ai pu lire que les fonctions ont un peu de mal avec les caractères spéciaux.
Ils en parlent dans les commentaires de la fonction xml_parse par exemple. Et certains apportent des solutions pour régler certains problèmes apparemment.

Hors ligne

#7 31-01-2010 10:57:47

moijhd
Membre
Inscription : 13-06-2009
Messages : 167

Re : Xml et accents

Pour essayer de résoudre ce problème, j'ai changé un peu mon code.

Tout d'abord, j'encode le texte entre mes balises XML avec la fonction suivante que j'ai trouvé :

[code php]
<?php
function xml_character_encode($string, $trans='') {
  $trans = (is_array($trans)) ? $trans : get_html_translation_table(HTML_ENTITIES, ENT_QUOTES);
  foreach ($trans as $k=>$v) $trans[$k]= "&#".ord($k).";";

  return strtr($string, $trans);
}
?>
[/code]

De même, pour éviter la division lors de l'apparition d'un caractère spécial (ce qui ne l'évite pas vraiment mais en fait la concaténation) :

[code php]
<?php
// Gere le texte
    public function CData($Parser, $CData){
        /*
...
*/
        $this->CurrentData .= $CData;
        /*
...
*/
    }

    // Gere les balises fermantes
    public function TagClose($Parser, $Tag){
                /*
...
*/   
// On récupère les données présentes dans $this->CurrentData
traitement($this->CurrentData );
        // On réinitialise les données a zéro
        $this->CurrentData = '';
                /*
...
*/    }
?>
[/code]


Et $string a éventuellement était traitée préalablement par htmlentities().

Qu'en pensez-vous ?

Dernière modification par moijhd (31-01-2010 11:00:43)

Hors ligne

Pied de page des forums