Вопрос по utf-8, php, xmlwriter – Проблемы с кодировкой XMLWriter (PHP)

2

Возьмите этот простой код PHP:

<code>$xmlWriter = new XMLWriter();
$xmlWriter->openURI('php://output');
$xmlWriter->startDocument('1.0', 'utf-8');

$xmlWriter->writeElement('test', $data);

$xmlWriter->endDocument();
$xmlWriter->flush();
</code>

Класс XMLWriter имеет приятную особенность: он преобразует любые данные, которые вы ему предоставляете, в выходную кодировку. Например, здесь он будет конвертировать$data в UTF-8, потому что я прошел'utf-8' вstartDocument функция.

Проблема в том, что в моем случае содержание$data исходит из базы данных, формат вывода которой UTF-8 иis therefore already in UTF-8, XMLWriterprobably thinks the data is in ISO-8859-1 and converts it again to UTF-8, and I get weird symbols где я должен получить акценты.

В настоящее время я используюutf8_decode вокруг каждой строки, поступающей из базы данных, что означает, что я преобразую из UTF-8 в ISO-8859-1, а затем XMLWriter превращает ее обратно в UTF-8.

Это работает, но не чисто:

<code>$xmlWriter->writeElement('test', utf8_decode($data));
</code>

Есть ли более чистое решение?

EDIT: показывая полный пример

<code>$xmlWriter = new XMLWriter();
$xmlWriter->openURI('php://output');
$xmlWriter->startDocument('1.0', 'utf-8');
$xmlWriter->startElement('usersList');

$database = new PDO('mysql:host=localhost;dbname=xxxxx', 'xxxxx', 'xxxxx');
$database->exec('SET CHARACTER SET UTF8');
$database->exec('SET NAMES UTF8');
foreach ($database->query('SELECT name FROM usersList') as $user)
   $xmlWriter->writeElement('user', $user[0]);   // if the user's name is 'hervé' in the database, it will print 'hervé' instead

$xmlWriter->endElement();
$xmlWriter->endDocument();
$xmlWriter->flush();
</code>
не могли бы вы показать, откуда поступает $ data? (запрос включен) Manuel

Ваш Ответ

1   ответ
6

Я не уверен, откуда вы взяли, чтоXMLWriter конвертирует кодировки Это не так. Выmust снабди его utf-8. Он может выводить разные кодировки, но входные строки должны быть utf-8.

Здесь может происходить одно из двух:

Whatever you are using to view your output document is interpreting the string as win-1252. If you are viewing your output in a browser, you may need to set the content-type header like so: header('Content-Type: application/xml; charset=UTF-8'); You stored your data in your database incorrectly, and your "é" is actually two unicode characters "é". Fixing this is difficult.

Похожие вопросы