Хорошая точка зрения. Спасибо!

а:

Предупреждение: simplexml_load_string () [function.simplexml-load-string]: Сущность: строка 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&#xe7;ais</old_value>
    <new_value>Role &#xe7; en fran&#xe7;ais</new_value>
</audit_detail></audit></xml>

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

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

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

Я перебираю, используя это:

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&#xe7;ais</old_value>
        <new_value>Role &#xe7; en fran&#xe7;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:

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

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

Редактировать № 2 - Я попробовал utf8_decode, чтобы увидеть, не поможет ли это, но это не помогло.

utf8_decode($a->new_value);

Выход:

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

 TekiusFanatikus11 янв. 2011 г., 21:25
utf8_general_ci
 Peter Porfy11 янв. 2011 г., 21:04
Какова кодировка столбца в базе данных, где вы храните XML?

Ответы на вопрос(1)

Решение Вопроса

&#xe7; это «ç», тогда ваша кодировка - Windows-1252 (или, может быть, ISO-8859-1), но не UTF-8.

 TekiusFanatikus12 янв. 2011 г., 14:00
Спасибо за предложение, которое, кажется, избавилось от ошибки. Тем не менее, посмотрите мои правки, так как теперь у меня возникают проблемы с отображением этих специальных символов. Я пробовал несколько вещей, но проблема до сих пор не решена. Спасибо!
 TekiusFanatikus11 янв. 2011 г., 21:23
DOH! Я перевел эти значения в таблицу символов ISO-8859-1 ... вздох. Тогда это означает, что я не получаю UTF-8 из базы данных. Что было бы лучшим способом сделать это, не заходя в файл конфигурации? Я читал об именах наборов utf-8. Тем не менее, мое предложение выбора потерпит неудачу, когда у меня это будет
 TekiusFanatikus12 янв. 2011 г., 18:34
Хорошая точка зрения. Спасибо!
 Tomalak12 янв. 2011 г., 17:54
@Tekius: Боюсь, что проблемы с кодировкой символов между MySQL и PHP не являются моей областью знаний. Возможно, вы могли бы сделать новый вопрос, описывающий проблему более подробно, и свести его к первоначальному виду, чтобы новая проблема привлекла некоторое внимание. Вероятно, я бы начал с проверки того, что на самом деле хранится в базе данных (выберите коды символов из одного символа) и, если это правильно, UTF-8. Затем проверьте, что получает PHP (снова коды символов). Затем проверьте, соответствует ли это заголовку Content-Type. Затем, что получает браузер (через FireBug или WireShark).
 Tomalak11 янв. 2011 г., 22:54
@Tekius: В настоящее время вы используете конкатенацию строк (heredoc PHP) для создания своего XML. Не делай этого. Используйте DOM для создания своего XML. Может быть, еще несколько строк кода, но вы не будете сталкиваться с проблемами кодировки символов.

Ваш ответ на вопрос