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çais</old_value>
<new_value>Role ç en franç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çais</old_value>
<new_value>Role ç en franç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:
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:
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:
J'ai aussi remarqué que mon champ dans la base de données ne contiennent UTF-8. Ce qui est bon.
utf8_general_ci
OriginalL'auteur TekiusFanatikus | 2011-01-11
Vous devez vous connecter pour publier un commentaire.
Quand
ç
est "ç", alors votre encodage Windows-1252 (ou peut-être ISO-8859-1), mais pas en UTF-8.Vous êtes actuellement en utilisant la concaténation de chaîne (PHP heredoc) pour construire votre XML. Ne pas le faire. L'utilisation d'un DOM à construire votre XML. Peut-être un peu plus de lignes de code, mais vous n'aurez pas de problèmes d'encodage de caractères.
Merci pour la suggestion, qui semble avoir réussi à se débarrasser de l'erreur. Cependant, voir mes modifications comme je suis maintenant à avoir des problèmes d'affichage de ces caractères spéciaux. J'ai essayé quelques petites choses, mais le problème est toujours pas résolu. Merci!
J'ai peur de codage de caractères problèmes entre MySQL et PHP ne sont pas mon domaine d'expertise. Peut-être que vous pourriez faire une nouvelle question en décrivant le problème plus en détail et de réduire celui-ci à sa forme d'origine, de sorte que le nouveau problème reçoit une certaine attention. Je serais probablement commencer par vérifier que la base de données stocke en fait (sélectionnez les codes de caractères de caractères uniques) et si c'est bon UTF-8. Ensuite, vérifiez que PHP reçoit (char codes à nouveau). Ensuite vérifier si c'est compatible avec le Type de Contenu d'en-tête. Alors que le navigateur reçoit (via FireBug ou WireShark).
Bon point. Merci!
OriginalL'auteur Tomalak