Другая ошибка XML-анализа PHP: «Вход не соответствует UTF-8, укажите кодировку!»

Ошибка:

Предупреждение: simplexml_load_string () [function.simplexml-load-string]: Entity: строка 3: ошибка парсера: вход не соответствует UTF-8, указывается кодировка! Байты: 0xE7 0x61 0x69 0x73

XML из базы данных (выход из источника просмотра в 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> 

Если я правильно понимаю, ошибка связана с первым, заключенным в тег old_value. Если быть точным, ошибка связана с этим на основе байтов: «Â»?

Вот как я загружаю XML:

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

I цикл через это:

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

Поле в базе данных представляет собой текст типа данных и устанавливается utf8_general_ci.

Моя функция создания контуров 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; } 

Вставка в базу данных выполняется следующим образом:

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

Самая странная часть состоит в том, что следующие работы (без объявления xml) в простом 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);

Может кто-то помочь пролить свет на это?

Редактировать # 1 – теперь я использую DOM для создания документа XML и избавился от этой ошибки. Функция здесь:

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

Тем не менее, я думаю, что теперь у меня проблема с отображением, так как этот текст «Roééleç sé en franêais» (new_value) отображается как:

проблема отображения:

В моем документе HTML у меня есть следующее объявление для типа содержимого (к сожалению, у меня нет ключей для внесения изменений здесь):

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

Я попытался iconv () преобразовать в ISO-8859-1, однако большинство специальных символов удаляются при выполнении преобразования. Все, что осталось, это «Ro», используя эту команду:

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

Выход iconv:

Поле в db: utf8_general_ci. Однако кодировка соединения будет тем, что по умолчанию.

Не совсем уверен, куда идти отсюда …

Редактировать # 2 – я попробовал utf8_decode, чтобы убедиться, что это не поможет, но это не так.

 utf8_decode($a->new_value); 

Вывод:

Я также заметил, что мое поле в db действительно содержало UTF-8. И это хорошо.