Возьмите этот простой PHP-код:
$xmlWriter = new XMLWriter(); $xmlWriter->openURI('php://output'); $xmlWriter->startDocument('1.0', 'utf-8'); $xmlWriter->writeElement('test', $data); $xmlWriter->endDocument(); $xmlWriter->flush();
Класс XMLWriter имеет приятную функцию: он преобразует любые данные, которые вы передаете ему в выходную кодировку. Например, здесь он преобразует $data
в UTF-8, потому что я передал 'utf-8'
в функции startDocument
.
Проблема в том, что в моем случае содержимое $data
поступает из базы данных, выходной формат которой UTF-8 и , следовательно, уже находится в UTF-8 . XMLWriter, по- видимому, считает данные в ISO-8859-1 и снова преобразовывает его в UTF-8, и я получаю странные символы, где мне нужно получить акценты.
В настоящее время я использую utf8_decode
каждой строки, поступающей из базы данных, что означает, что я конвертирую из UTF-8 в ISO-8859-1, а затем XMLWriter возвращает его обратно в UTF-8.
Это работает, но не чисто:
$xmlWriter->writeElement('test', utf8_decode($data));
Есть ли более чистое решение?
EDIT : полный пример
$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();
Я не уверен, где вы поняли, что XMLWriter
преобразует кодировки. Это не так. Вы должны предоставить его utf-8. Он может выводить различные кодировки, но входные строки должны быть utf-8.
Здесь может быть одна из двух вещей:
header('Content-Type: application/xml; charset=UTF-8');