Un autre PHP XML parsing error: “Entrée n'est pas correcte UTF-8, indiquer l'encodage!”

Erreur:

Avertissement: simplexml_load_string()
[function.simplexml-load-string]:
Entité: ligne 3: parser error : Entrée
n'est pas correcte UTF-8, indiquer l'encodage
! Octets: 0xE7 0x61 0x69 0 x 73

XML à partir de la base de données (la sortie de l'affichage de la source dans les FF):

<?xml version="1.0" encoding="UTF-8" ?><audit><audit_detail>
    <fieldname>role_fra</fieldname>
    <old_value>Role en fran&#xe7;ais</old_value>
    <new_value>Role &#xe7; en fran&#xe7;ais</new_value>
</audit_detail></audit></xml>

Si je comprends bien, l'erreur est liée à la première ç codée dans le old_value tag. Pour être précis, l'erreur est liée à cette fonction sur les octets: "çais" ?

Voici comment je charge le XML:

$xmlData = simplexml_load_string($ed['updates'][$i]['audit_data']);

La je boucle par le biais de l'utilisation de ce:

foreach ($xmlData->audit_detail as $a){
//code here
}

Le champ dans la base de données est du type de données texte et est mis en utf8_general_ci.

Ma fonction pour créer le audit_detail talons:

function ed_audit_node($field, $new, $old){


    $old = htmlentities($old, ENT_QUOTES, "UTF-8");
    $new = htmlentities($new, ENT_QUOTES, "UTF-8");

    $out = <<<EOF
        <audit_detail>
            <fieldname>{$field}</fieldname>
            <old_value>{$old}</old_value>
            <new_value>{$new}</new_value>
        </audit_detail>
EOF;
    return $out;
}

L'insérer dans la base de données se fait comme ceci:

function ed_audit_insert($ed, $xml){
    global $visitor;

    $sql = <<<EOF
    INSERT INTO ed.audit
    (employee_id, audit_date, audit_action, audit_data, user_id) 
    VALUES (
        {$ed[emp][employee_id]}, 
        now(), 
        '{$ed[audit_action]}', 
        '{$xml}', 
        {$visitor[user_id]}
    );      
EOF;
    $req = mysql_query($sql,$ed['db']) or die(db_query_error($sql,mysql_error(),__FUNCTION__));

}

Le plus étrange, c'est que les œuvres suivantes (sans la déclaration xml) dans un simple fichier PHP:

$testxml = <<<EOF
<audit><audit_detail>
        <fieldname>role_fra</fieldname>
        <old_value>Role en fran&#xe7;ais</old_value>
        <new_value>Role &#xe7; en fran&#xe7;ais</new_value>
    </audit_detail></audit>
EOF;

$xmlData = simplexml_load_string($testxml);

Quelqu'un peut-il m'éclairer sur ce point?

Edit #1 - je suis maintenant à l'aide de DOM pour construire le document XML et ont réussi à se débarrasser de l'erreur. Fonction:

$dom = new DomDocument();
$root = $dom->appendChild($dom->createElement('audit'));
$xmlCount = 0;

if($role_fra != $curr['role']['role_fra']){
   $root->appendChild(ed_audit_node($dom, 'role_fra', $role_fra, $curr['role']['role_fra'])); 
   $xmlCount++;
}

...

function ed_audit_node($dom, $field, $new, $old){

    //create audit_detail node
    $ad = $dom->createElement('audit_detail');

    $fn = $dom->createElement('fieldname');
    $fn->appendChild($dom->createTextNode($field));
    $ad->appendChild($fn);

    $ov = $dom->createElement('old_value');
    $ov->appendChild($dom->createTextNode($old));
    $ad->appendChild($ov);

    $nv = $dom->createElement('new_value');
    $nv->appendChild($dom->createTextNode($new));
    $ad->appendChild($nv);

    //append to document
    return $ad;
}

if($xmlCount != 0){
    ed_audit_insert($ed,$dom->saveXML());   
}

Cependant, je pense que j'ai maintenant un problème d'affichage que ce texte "Roééleç sé en franêais" (nouvelle_valeur) est affiché comme:

problème d'affichage:
Un autre PHP XML parsing error: “Entrée n'est pas correcte UTF-8, indiquer l'encodage!”

Dans mon document HTML, j'ai la déclaration suivante pour le type de contenu (malheureusement, je n'ai pas les clefs pour y apporter des modifications):

<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
...
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

J'ai essayé la fonction iconv() pour convertir en ISO-8859-1, cependant, la plupart des caractères spéciaux sont supprimés lorsque vous effectuez la conversion. Tout ce qui reste est "Ro" à l'aide de cette commande:

iconv('UTF-8','ISO-8859-1',$node->new_value);

iconv de sortie:
Un autre PHP XML parsing error: “Entrée n'est pas correcte UTF-8, indiquer l'encodage!”

Le champ dans la base de données est: utf8_general_ci. Cependant, la connexion charset serait tout ce qui est la valeur par défaut.

Pas tout à fait sûr où aller à partir d'ici...

Edit #2 - j'ai essayé utf8_decode pour voir si ce ne serait pas aider, mais il n'a pas.

utf8_decode($a->new_value);

De sortie:
Un autre PHP XML parsing error: “Entrée n'est pas correcte UTF-8, indiquer l'encodage!”

J'ai aussi remarqué que mon champ dans la base de données ne contiennent UTF-8. Ce qui est bon.

Qu'est-ce que la colonne d'encodage dans la base de données où vous stockez le fichier xml?
utf8_general_ci

OriginalL'auteur TekiusFanatikus | 2011-01-11