Aggregator & encoding

Catégories:

Bonjour,

J’ai installé la version 4.6.5 de Drupal et je veux aggréger le rss de
linuxfr.org (http://linuxfr.org/backend/news/rss20.rss) mais je suis face
à un problème d’encodage :

  • Drupal semble supporter l’utf-8 correctement
  • Le rss de linuxfr.org est en iso-8859-15

=> le résultat de l’aggrégation et de la conversion donne des résultats qui ne
sont pas ceux escomptés :-/, j’obtiens par exemple : «définitions» à la place
de «définitions».

Les questions sont donc :

  • Quelqu’un a-t-il ce genres de problèmes et si oui, les a-t-il résolu ?
    J’ai cherché sur leur site, mais sans succès :-(

  • Comment faire une bonne conversion de l’iso-8859-15 vers l’utf-8 sachant
    que j’ai bien essayé avec iconv et mb_convert_encoding ? Je m’y suis peut-etre
    mal pris !

Pour info je suis sous Debian / apache2 / php5 / postgresql 8 (Unicode)

Voilà, merci pour vos infos !
a+

Xavier

#

Ca me parait bizzare… En effet, on obtient «définitions» à la place
de «définitions» lorsque on essaye de lire en iso-8859 un flux encodé en fait en utf8 (et non l’inverse).

Pouvez vous nous donner une url où l’on pourrait regarder ce qui se passe ?

  • Damien
#

Salut,

Ca se passe par ici, c’est chez moi en test, alors merci de ne pas tenir
compte des articles :-)

http://pingoo.homelinux.org/ ?q=aggregator/sources/1

Merci,
Xavier

#

Ok je confirme qu’il y a bien un problème, lié à une modification dans PHP5. Je vais regarder si le bug a été signalé ou pas encore.

Pour le corriger de manière temporaire, éditez includes/common.inc et modifiez la fonction drupal_xml_parser_create() :

<?php
 
// Unsupported encodings are converted here into UTF-8.
 
$php_supported = array('utf-8', 'iso-8859-1', 'us-ascii');
  if (!
in_array(strtolower($encoding), $php_supported)) {
   
$out = drupal_convert_to_utf8($data, $encoding);
    if (
$out !== false) {
     
$data = $out;
     
$encoding = 'utf-8';
    }
    else {
     
watchdog('php', t("Could not convert XML encoding '%s' to UTF-8.", array('%s' => $encoding)), WATCHDOG_WARNING);
      return
0;
    }
  }
?>

en ajoutant la ligne marquée ci-dessous :

<?php
 
// Unsupported encodings are converted here into UTF-8.
 
$php_supported = array('utf-8', 'iso-8859-1', 'us-ascii');
  if (!
in_array(strtolower($encoding), $php_supported)) {
   
$out = drupal_convert_to_utf8($data, $encoding);
    if (
$out !== false) {
     
$data = $out;
     
$encoding = 'utf-8';
     
$data = ereg_replace('^(<\?xml[^>]+encoding)="([^"]+)"', '\1="utf8"', $data); // ** LIGNE A AJOUTER **
   
}
    else {
     
watchdog('php', t("Could not convert XML encoding '%s' to UTF-8.", array('%s' => $encoding)), WATCHDOG_WARNING);
      return
0;
    }
  }
?>

Est-ce que cela peut résoudre votre problème ?

  • Damien
#

Nickel !!!

Ca fonctionne impéccable, j’ai bien tous les caractères accentués !
Ceci dit, ca parait super logique mais je n’ai pas eu l’idée de le faire :-p
Je t’invite à fournir un patch parce que je suis pas le seul à avoir eu le problème !

Encore merci, a+
Xavier

#

Je n’ai pas de quoi faire un patch proprement ici (je ne suis pas chez moi). Si tu veux t’en charger, n’hésite pas !

  • Damien
#

arff je sais pas comment vous fonctionnez pour faire vos patchs, donc dans
le doute j’en met un ici, et je te laisse ensuite seul maitre à bord pour un officiel,
tu le mérites bien :-D

--- includes/common.inc   2005-12-02 11:30:59.000000000 +0100
+++ includes/common.inc 2006-02-14 22:02:30.000000000 +0100
@@ -1598,6 +1598,7 @@
     if ($out !== false) {
       $data = $out;
       $encoding = 'utf-8';
+      $data = ereg_replace('^(<\?xml[^>]+encoding)="([^"]+)"', '\1="utf8"', $data);
     }
     else {
       watchdog('php', t("Could not convert XML encoding '%s' to UTF-8.", array('%s' => $encoding)), WATCHDOG_WARNING);

Merci encore, a+
Xavier

#
Syndiquer le contenu