2016-03-08 2 views
2

Je pense avoir trouvé un bogue dans XMLReader::readOuterXML en PHP 5.5.33 et 5.6.19 ... PHP 5.2.17 va bien, n'a pas testé avec 7. Mon PHP est VC11 x86 Thread Safe, avec Apache 2.4.18 VC11 Win32.Bug en PHP? : XMLReader :: readOuterXml génère "Entrée n'est pas correcte UTF-8" lors de l'entrée IS UTF-8

Lors de la lecture d'un fichier XML correctement encodé en UTF-8 (avec ou sans BOM), readOuterXML parfois générer l'avertissement "Input is not proper UTF-8, indicate encoding !", même si plusieurs caractères codés UTF-8 sont lus avant la ligne incriminée.

Le même fichier, avec certaines balises ou chaînes supprimées, passera sans problème.

Ceci est une version simplifiée de la fonction que j'utilise pour lire le fichier XML:

function TestXML($file) { 
    $XR = new XMLReader; 
    $XR->open($file, null, LIBXML_NOBLANKS); 

    //Looking for specific node 
    while (($lastRead = $XR->read()) && ($XR->name !== 'records')) { 
     ; 
    } 

    if (!$lastRead) { 
     echo $file.' : Invalid file or no records'; 
     $XR->close(); 
     return; 
    } 

    //Looking for specific node 
    while (($lastRead = $XR->read()) && ($XR->name !== 'record')) { 
     ; 
    } 
    while ($lastRead) { 

     $xml = $XR->readOuterXML(); 
     if ($xml === '') { 
      $err = ''; 
      if ($e = libxml_get_last_error()) { 
       $err = $e->message.' (line: '.$e->line.')'; 
      } 
      $XR->close(); 
      echo $file.' : Problem with file'.($err ? ' — '.$err : '').'.'; 
      return; 
     } 

     //Looking for specific node 
     while (($lastRead = $XR->next()) && ($XR->name !== 'record')) { 
      ; 
     } 
    } 
    $XR->close(); 
    echo $file.' : Good!'; 
    return; 
} 

Et c'est le plus petit XML que je pourrais produire (sans BOM) qui génèrent le problème:

<?xml version="1.0" encoding="utf-8"?> 
<records> 

<record><aaa><bbbb><ccc><![CDATA[XXX Xxxxxxxxxxxx]]></ccc><ddd><![CDATA[XXX Xx]]></ddd></bbbb><eee><![CDATA[Xxxxx xxxxxxx: xxxx://xxx.xxx.xx.xx/xxxx?xxxxXx=0xx000x0-000x-0xx0-x000-x0000xx0xx00 
Xxxxxxxxxxxx xx Xxxxxxxxxxxx Xxxxxxxxx xx Xxxxxxxxx Xxxxxxxxxxxx Xxxxxxxxxxx Xxxxxxxxxxxx (XXX Xxxxxxxxxxxx), xxxxxxxxx xxxxxxx xx Xxx Xxxxxxxxxx Xxxxxxxxxx Xxx.]]></eee></aaa><fff><bbbb><ggg><![CDATA[Xxxxxxxxx Xxxxxxxxxxxxxxx Xxxxxxxxxx xx Xxxxxxxxxxxx]]></ggg><ccc><![CDATA[XXX Xxxxxxxxxxxx]]></ccc></bbbb><hhh><![CDATA[Xx xxxxx, xx xxxxxxxxxxx XXX Xxxxxxxxxxxx x xxxxxcé x’xxxxxxxx xxx x’Xxxxxxléx léxxxxxxxxx xx xx xxxxxxxx xx xx Xxxxxxxxxx Xxxxxxxxxx Xxx (xxx xxx xx xxxxxxxxxx xxxxxxxxx). Xxxxx xxx xréxxxx xxx xxxxxx xxx déxxxxxxxx XXX Xxxxxxxxxxxx xx xxxx xx’xxxxxxxxxxxx xxxxxxxxxxxxxxx xxxxréxxxxxxtéx xx xxxxxxx xxx XX, xxx XXX xx xxx XXX xx xx xxxxxxxx xx xxxxx x’xxxxxxxx xx xxxxx xx xxxxxxxxx xxxxxxxxxxxxx xxréé (XXX). (Xxxxxxxxéx XXX - Xxx 0000)]]></hhh></fff></record> 

</records> 

Puisque le problème peut disparaître avec l'ajout d'un couple d'espaces (par exemple, si ce qui précède est beautyfied, il ne causera pas de problème), je l'ai téléchargé les fichiers que j'ai utilisé pour mes tests:

Bad file (sans BOM)
Bad file (avec nomenclature et un couple de 'x' retiré du contenu de la balise <ggg>)
Good file (comme mauvais, moins l'étiquette <ccc>).
Vous pouvez également supprimer un couple de 'mots' du fichier Bad et il passera par.

Alors, est-ce vraiment un bug en PHP ou est-ce que je manque quelque chose?

+1

Il a en effet été confirmé comme un bug ([bug # 71805] (https://bugs.php.net/bug.php?id=71805)) dans libxml 2.9. 3 ([bug # 760183] (https://bugzilla.gnome.org/show_bug.cgi?id=760183)), qui est utilisé en PHP depuis 5.5.32 & 5.6.18 – Goozak

Répondre

0

Juste pour fermer cette question: Comme mentionné dans mon comment, ce fut un bogue dans PHP qui a été récemment corriger. Pour autant que je sache, les versions affectées de PHP sont 5.5.32, 5.5.33, 5.5.34, 5.5.35, 5.6.18, 5.6.19, 5.6.20 et 5.6.21.

0

le fixe avec l'installation libxml2-devsudo apt-get install libxml2-dev