Vous n'êtes pas identifié(e).
Pages :: 1
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
<?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
Structure (à titre d'exemple de mon fichier) :
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
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
Mon problème ici est que "Prénom 1" est reconnu sous la forme de "Pr" puis de "énom 1"
Hors ligne
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
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
Pages :: 1