Intereting Posts
Быстрая реализация PHP-кода Aho-Corasick PHP меняет старый mysql_query на PDO Ограничение количества символов в строке Скрытие сообщения об ошибке PHP / MySQL Вызов функции с явными параметрами vs. call_user_func_array () Отправка информации в ngnix из php на том же сервере без http Как изменить корзину WooCommerce, страницы проверки (основная часть темы) CodeIgnitor валидация переменных / входных данных, не входящих в форму? Карты Google с PHP и MYSQL Ошибка при включении redirect_uri с getLoginUrl (PHP PHP SDK) Поверните PNG, затем сохраните с помощью прозрачности изображения Добавление новых элементов пользовательского интерфейса moodle в соответствии с событием onchange выбранного элемента Каков наилучший способ локализовать дату на Laravel? Отправить одноразовую ссылку для входа через hook_mail Кажется, не может загрузиться CSV с использованием PHP Curl, когда ответ является содержимым: вложение

Проблемы с кодировкой с помощью XMLWriter (PHP)

Возьмите этот простой 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.

    Здесь может быть одна из двух вещей:

    1. Независимо от того, что вы используете для просмотра вашего выходного документа, интерпретируйте строку как win-1252. Если вы просматриваете свой вывод в браузере, вам может потребоваться установить заголовок содержимого таким образом: header('Content-Type: application/xml; charset=UTF-8');
    2. Вы неправильно сохранили свои данные в своей базе данных, а ваш «é» на самом деле является двумя символами Unicode «Ã ©». Крепить это сложно.