Otro error de análisis de PHP XML: "La entrada no es UTF-8 adecuada, ¡indica codificación!"

Error:

Advertencia: simplexml_load_string () [function.simplexml-load-string]: Entidad: línea 3: error del analizador: ¡La entrada no es correcta UTF-8, indique codificación! Bytes: 0xE7 0x61 0x69 0x73

XML de la base de datos (salida de la fuente de vista en 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 entiendo correctamente, el error está relacionado con el primer ç codificado en la etiqueta old_value. Para ser precisos, el error está relacionado con esto en función de los bytes: "çais"?

Así es como cargo el XML:

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

Lo recorro usando esto:

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

El campo en la base de datos es de texto de tipo de datos y se establece utf8_general_ci.

Mi función para crear los apéndices audit_detail:

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;
}

La inserción en la base de datos se realiza así:

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__));

}

La parte más extraña es que lo siguiente funciona (sin la declaración xml) en un archivo PHP simple:

$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);

¿Alguien puede ayudar a arrojar algo de luz sobre esto?

Editar # 1 - Ahora estoy usando DOM para compilar el documento XML y me he librado del error. Funcion aqui:

$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());   
}

Sin embargo, creo que ahora tengo un problema de visualización ya que este texto "Roééleç sé en franêais" (nuevo_valor) se muestra como:

problema de visualización:

En mi documento HTML, tengo la siguiente declaración para el tipo de contenido (desafortunadamente, no tengo las teclas para hacer cambios aquí):

<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" />

Intenté iconv () para convertir a ISO-8859-1, sin embargo, la mayoría de los caracteres especiales se eliminan al hacer la conversión. Todo lo que queda es "Ro" usando este comando:

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

salida iconv:

El campo en la base de datos es: utf8_general_ci. Sin embargo, el conjunto de caracteres de conexión sería el predeterminado.

No estoy seguro de a dónde ir desde aquí ...

Editar # 2 - Intenté utf8_decode para ver si eso no ayudaría, pero no fue así.

utf8_decode($a->new_value);

Salida:

También noté que mi campo en el db contenía UTF-8. Lo que es bueno.

Respuestas a la pregunta(1)

Su respuesta a la pregunta