rss, xml et caractères spéciaux

rss, xml et caractères spéciaux - XML/XSL - Programmation

Marsh Posté le 07-12-2004 à 11:27:09    

Salut tous,
 
J'ai mis en place un fil rss pour mon site www.planetebd.com et j'ai un petit pb que je n'arrive pas à résoudre.
 
Mon fil est là : http://www.planetebd.com/php/planetebd-rss-light.php
 
Et si vous le regarder, tous les caractères genre ', !, et autres, sont remplacés par un carré !!!
J'ai essayé :
- de changer le jeu de caractères du fichier xml, ca marche pas,
- d'utiliser les fonctions php htmlspecialchars, htmlentities, et ça change rien non plus!
 
Comment faire pour que le texte soit entièrement lisible???
 
Merci !!

Reply

Marsh Posté le 07-12-2004 à 11:27:09   

Reply

Marsh Posté le 07-12-2004 à 12:11:22    

SOS - SOS a écrit :


Comment faire pour que le texte soit entièrement lisible???


 
ne pas faire du copier-coller depuis word ou faire une routine pour remplacer les caractères spéciaux par leurs entités html


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 07-12-2004 à 12:29:35    

c'est ce que j'ai essayé bien sûr (c'est le htmlentities dont je parle au dessus).
 
Résultat, il me met une erreur sur un à .... (cf fichier en ligne : http://www.planetebd.com/php/planetebd-rss-light.php ) Comprend pas pourquoi çà le dérange.
Peut-etre que mon jeu de caractères n'est pas bon, l'ISO-8859-15 ???

Reply

Marsh Posté le 07-12-2004 à 12:32:23    

Tu le construit comment ton XML ?


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 07-12-2004 à 12:36:30    

en php directement, avec une requete dans ma base, puis la contstruction du fichier rss ligne par ligne. J'ai rétabli la version sans les htmlentities, et le fichier s'affiche correctement, à part ces maudits accents, apostrophes, etc... !
Bouh !

Reply

Marsh Posté le 07-12-2004 à 12:39:11    

SOS - SOS a écrit :

c'est ce que j'ai essayé bien sûr (c'est le htmlentities dont je parle au dessus).


 
 
non, htmlentities() convertit une table par défaut - cf fonction get_html_translation_table().
 
Les caractères qui ne passent pas à l'affichage ne sont pas contenus dans ta table de conversion.
 
essayes d'appliquer ca pour voir :

Code :
  1. $text=str_replace ('’', '& #8217;', $text);


 
supprimes l'espace entre & et #8217;


Message édité par simogeo le 07-12-2004 à 12:40:08

---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 07-12-2004 à 12:43:47    

Je viens de checker de nouveau ton code .. je suis sur que c'est ca ....
 
Par exemple les ... après le mot Caraïbes.
 

Code :
  1. $text=str_replace ('…', '& #8230;', $text);


 
 
 
tjrs en supprimant l'espace entre & et #8230;! ...   Moi je le mets sinon le forum les interpréte


Message édité par simogeo le 07-12-2004 à 12:44:51

---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 07-12-2004 à 13:10:16    

Et avec DOM, au lieu de bricoler ?
 
<?php
 
$d = domxml_new_doc("1.0" );
$root = $d->add_root("root" );
$node = $d->create_element("para" );
$text = $d->create_text_node( utf8_encode( "Bonjour les zamis ! Z'allez bien ? Fait bô non ?" ) );
$node->append_child( $text );
$root->append_child($node);
echo $d->dump_mem();
 
?>


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 07-12-2004 à 13:18:51    

Mara's dad a écrit :

Et avec DOM, au lieu de bricoler ?


 
je lui explique d'ou vient son problème, mes exemples sont là pour illustrer mes propos, je ne les présente pas comme LA solution
 
Concernant le DOM, ca n'a rien a voir avec le problème initial du posteur.
Du reste, je t'accorde que c'est plus propre.


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 07-12-2004 à 13:43:22    

Mara's dad a écrit :

Et avec DOM, au lieu de bricoler ?
 
<?php
 
$d = domxml_new_doc("1.0" );
$root = $d->add_root("root" );
$node = $d->create_element("para" );
$text = $d->create_text_node( utf8_encode( "Bonjour les zamis ! Z'allez bien ? Fait bô non ?" ) );
$node->append_child( $text );
$root->append_child($node);
echo $d->dump_mem();
 
?>


Ça, c'est bien!
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 07-12-2004 à 13:43:22   

Reply

Marsh Posté le 07-12-2004 à 13:44:36    

Merci chef :jap:


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 07-12-2004 à 13:50:07    

simogeo a écrit :

Concernant le DOM, ca n'a rien a voir avec le problème initial du posteur.
Du reste, je t'accorde que c'est plus propre.

Si justement !
Avec le DOM normalement, quand tu demande :
$monDoc->create_text_node( "MonTexteBrut" );
T'a pas à te poser la question des caractères spéciaux.
Il sont normalement encodés comme déclaré dans le Document.
 
Bon, en PHP, c'est pas encore au point, et il faut par exemple utiliser utf8_encode, surtout qu'il n'y a pas de solution simple pour indiquer le codage du document. Mais c'est comme ça qu'il faut faire pour être tranquile, et ça répond à la question du monsieur. :D


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 07-12-2004 à 14:04:35    

ok ok pardon g T allé bouffer... Je vais tenter le DOM car le coup des str_replace me semble un peu compliqué (si il faut que je l'applique avec tous les caractères susceptibles de m'embeter...)

Reply

Marsh Posté le 07-12-2004 à 15:44:38    

Citation :

Si justement !  
Avec le DOM normalement, quand tu demande :  
$monDoc->create_text_node( "MonTexteBrut" );  
T'a pas à te poser la question des caractères spéciaux.  
Il sont normalement encodés comme déclaré dans le Document.  
 
Bon, en PHP, c'est pas encore au point, et il faut par exemple utiliser utf8_encode, surtout qu'il n'y a pas de solution simple pour indiquer le codage du document. Mais c'est comme ça qu'il faut faire pour être tranquile, et ça répond à la question du monsieur. :D


 
bon j'ai suivi ton conseil... Mais alors bonjour le résultat :D
J'ai encodé systématiquement mes chaines de caractères, issues de mysql, en utf8. En revanche, je ne sais pas du tout comment je rajoute encoding="utf-8"  dans le tag xml???
J'ai fati cela dans le fichier suivant : http://www.planetebd.com/php/test.php qui, tu vas le voir, indique pleins de bizarreries au niveau de l'affichage de pleins de caractères. On dirait que j'ai regressé, même si je sens que je ne suis pas trop loin de la soluce !!!

Reply

Marsh Posté le 07-12-2004 à 15:59:52    

SOS - SOS > ton fichier doit être enregistré au format utf-8!
 
Mara's dad > uiui :jap:


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 07-12-2004 à 16:13:32    

ben oui mais justement, comment je fais????
echo utf8_encode($doc->dump_mem()) ?

Reply

Marsh Posté le 07-12-2004 à 16:26:02    

SOS - SOS a écrit :

ben oui mais justement, comment je fais????
echo utf8_encode($doc->dump_mem()) ?


 
non, ton éditeur de code dois te permettre un enregistrement en utf-8
 
exemple avec le blc note windows :
 
Enregistrer Sous > Codage -par défaut c'est de l'ANSI, choisir UTF-8


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 07-12-2004 à 16:26:29    

l'utf8 ca susk :o

Reply

Marsh Posté le 07-12-2004 à 16:46:04    


 
U 2 [:itm]


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 07-12-2004 à 16:46:24    

bon, ca me parait mal barré tout cela. Si j'enregistre mon fichier en UTF8, tout déconne puisque mon serveur supporte le US-ASCII...
Bref, je sens que ce problème n'a aucune solution, ca me déprime !!! Bouh !! Pourquoi le monde est-il si cruel???

Reply

Marsh Posté le 07-12-2004 à 16:46:53    

SOS - SOS a écrit :

En revanche, je ne sais pas du tout comment je rajoute encoding="utf-8"  dans le tag xml???
J'ai fati cela dans le fichier suivant :


 
Je l'ai dit plus haut que c'est possible !
 
C'est un peu du bricolage, mais bon ça marche bien :D
 

<?php
header('Content-type: text/xml');
$d = domxml_open_mem( "<?xml version=\"1.0\" encoding=\"UTF-8\"?><root />" );
$root = $d->document_element();
$node = $d->create_element("para" );
$text = $d->create_text_node( utf8_encode( "Bonjour les zamis ! Z'allez bien ? Fait bô non ?" ) );
$node->append_child( $text );
$root->append_child($node);
echo $d->dump_mem();
?>


 
EDIT : C'est mieux avec le header . . .


Message édité par Mara's dad le 07-12-2004 à 16:51:33

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 07-12-2004 à 16:54:17    

Mara's dad a écrit :

Je l'ai dit plus haut que c'est possible !
 
C'est un peu du bricolage, mais bon ça marche bien :D
 

<?php
$d = domxml_open_mem( "<?xml version=\"1.0\" encoding=\"UTF-8\"?><root />" );
$root = $d->document_element();
$node = $d->create_element("para" );
$text = $d->create_text_node( utf8_encode( "Bonjour les zamis ! Z'allez bien ? Fait bô non ?" ) );
$node->append_child( $text );
$root->append_child($node);
echo $d->dump_mem();
?>




 
m'etonnerait que ca change grand chose sur le coup.
La page me renvoie déjà un codage en UTF-8.  
 
(Firefox > Page Info > Encoding)


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 07-12-2004 à 17:06:57    

Autre solution plus propre mais pas documentée :
 
$d = domxml_new_doc("1.0" );  
$d->encoding = "UTF-8";
 
Pour voir les propriétés de $d :
echo( "<pre>" );
print_r( $d );
echo( "</pre>" );
:D


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 07-12-2004 à 17:11:46    

bon. Ca marche pas ! Je laisse tomber cette solution, et je vais prendre le problème en amont. Je vais virer tous les caractères spéciaux bizarroides de ma base de données, genre ..., ' et autres... Merci en tout cas pour votre aide (c un sacré merdier cette gestion des caractères...)

Reply

Marsh Posté le 07-12-2004 à 17:14:44    

pour mara's dad : ca me fait une erreur Call to a member function on a non-object in blabla...
Je pense qu'il n'y a donc pas de vraie solution à ce pb, je vais donc virer tout ces caractères pourris de ma base !
Na !

Reply

Marsh Posté le 07-12-2004 à 17:18:37    

replace le $d par ton objet hein :D

Reply

Marsh Posté le 07-12-2004 à 17:28:15    

SOS - SOS a écrit :

pour mara's dad : ca me fait une erreur Call to a member function on a non-object in blabla...
Je pense qu'il n'y a donc pas de vraie solution à ce pb, je vais donc virer tout ces caractères pourris de ma base !
Na !


SISI y'en a une !
Faut juste se calmer et suivre ce qui se passe.
Si tu ne peut pas utiliser la propritété encoding, la solution
domxml_open_mem( "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><root />" )
doit marcher.
Si les caractères de ta base sont en ISO-8859-1, essayes de ne pas utiliser utf8_encode()...
 
En tout cas, utiliser DOM est quasiment la seule solution qui t'assure d'avoir un document XML bien formé en sortie.
 
Sinon, regarde du coté de iconv :  
iconv("ISO-8859-1", "UTF-8", "This is a test." ) ou le contraire.
 
Fais des tests avec ce que tu as en base.


Message édité par Mara's dad le 07-12-2004 à 17:28:48

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 07-12-2004 à 17:44:43    

désolé mais comprend pas ce que tu me dis de faire.
Pourquoi je mettrai 'root' dans mon fichier xml? Si je le met, feedvalidator.org me dit Undefined root element: root  et si ne l'enleve, Call to a member function on a non-object  ...

Reply

Marsh Posté le 07-12-2004 à 17:51:30    

root, c'est un exemple !
C'est pour la fontion domxml_open_mem().
Si tu ne lui passe pas au moins un noeud racine, ce n'est pas un document valide :D
 
Est-ce que tu peut faire ça :
 
$d = domxml_new_doc("1.0" );  
$d->encoding = "TON ENCODING PREFERE";
 
?


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 08-12-2004 à 12:02:52    

Yes !
Ca fonctionne, mais mon feed affiche toujours pleins de caractères zarbes :
http://www.feedvalidator.org/check [...] Ftest3.php
 
Mon dieu quel enfer !!!

Reply

Marsh Posté le 08-12-2004 à 12:23:19    

j'ai pas tout lu mais http://www.planetebd.com/php/planetebd-rss-light.php est ok
 
et http://www.planetebd.com/php/test3.php est foireux, quel diff entre les 2 ?
 
edit: j'ai rien dit..


Message édité par push le 08-12-2004 à 12:25:01
Reply

Marsh Posté le 08-12-2004 à 12:26:30    

Le problème, c'est qu'aucuns des deux n'est correct justement.
- http://www.planetebd.com/php/planetebd-rss-light.php : developpé en php directement, avec un encoding="ISO-8859-15"
- http://www.planetebd.com/php/test3.php : developpé en php avec les composants dom, tout encodé en utf8
 
Dans les deux cas, j'arrive pas à faire en sorte qu'il n'y ait plus de caractères bizarres (et d'ailleurs, dans les deux cas, ce ne sont pas forcement les mêmes)
 
Pour le premier (planetebd-rss-light.php) je crois avoir tout essayé : htmlentities, htmlspecialchar et autres fonctions, rien n'y fait...

Reply

Marsh Posté le 08-12-2004 à 12:58:19    

ca n'a peut-être rien avoir mais essaye de mettre dans un .htaccess AddDefaultCharset UTF-8 ou AddDefaultCharset ISO-8859-1 selon le cas, on sait jamais  :??:

Reply

Marsh Posté le 08-12-2004 à 13:45:31    

Pourquoi y'a pas 'encoding="UTF-8"' dans ton xml généré par test3.php ?
 
Les caractères zarbi sont : & #x8D25; et & #x9973;
& #x8D25; remplace 'ète' et devrait être '& #xE8;te'
& #x9973; remplace 'ées' qui plus loin s'écrit normalement '& #xE9;es'
 
Pourquoi le début du fichier est-il comme ça ?
Les tags title, description, dc:publisher, dc:creator, et dc:rights sont touchés et pas le reste.
Ont-ils doit à un traitement particulier ?
Viennent-ils de la même source ?
 


Message édité par Mara's dad le 08-12-2004 à 13:46:33

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 08-12-2004 à 13:53:42    

Sinon, dans ton fichier généré par planetebd-rss-light.php, les caractères zarb sont des : ’ Code ascii 0x92
au lieu de ' Code ascii 0x27
 
En fait ton problème, c'est tes données qui sont foireuses !
 
Y'aurait pas un Mac la dessous ? ? ?
 
PS : les ’ ne s'affichent même pas dans la version test3.php ! ! !


Message édité par Mara's dad le 08-12-2004 à 13:56:04

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 08-12-2004 à 14:05:56    

Mara's dad a écrit :


En fait ton problème, c'est tes données qui sont foireuses !


 
[:noxauror]
tu jeteras un oeil à mes premiers posts!


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 08-12-2004 à 14:12:15    

simogeo a écrit :

[:noxauror]
tu jeteras un oeil à mes premiers posts!


Put... mais t'as raison :jap:
J'ai du trop forcer sur la roulette de la souris :/
 
Bon, il faut qu'il corrige ses données à la source. Il va pas monter une usine à gaz pour corriger ce genre de pb 'on the fly' tout de même


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 08-12-2004 à 14:18:53    

Mara's dad a écrit :


Bon, il faut qu'il corrige ses données à la source. Il va pas monter une usine à gaz pour corriger ce genre de pb 'on the fly' tout de même


 
J'ai mis une moulinette de ce type en place pour un CMS car pas de contrôle au niveau utilisateur.
Y'a pas 36 solutions dans ce cas là.
 
Dans son cas, s'il est seul à gérer son site. Vaut mieux qu'il fournisse des données intégres en effet.


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 08-12-2004 à 14:30:07    

bon, ben c'est bien ce que je pensais, et on pense donc pareil, mes données sont merdiques. J'avoue faire parfois un copié collé depuis Word, et notamment, il semblerait que les points de suspension ... soit transformés en un seull caractère bizarre, idem pour le '... Je vais te changer tout cela moi, ca va être vite vu ! En tout cas, super merci de m'avoir aidé !

Reply

Marsh Posté le 08-12-2004 à 14:41:35    

Ah C'est beau !!!
 
Avec deux str_replace sur les caractères affreux : … et ’ remplacés par ... et ', mon fil RSS est si beau !
Avis aux prochains qui galèrerait sur le même problème, l'idéal est de tout passer en utf8, d'utiliser
 
 $doc = domxml_new_doc("1.0" );
 $doc->encoding = "utf-8";  
 
et d'utiliser les dom... Puis de régler les pbs de caractères par des update directement dans la BDD !!!
 
Deux jours entiers pour en arriver à cette conclusion... grrrrrrrr

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed