#php #xml #character-encoding #simplexml
#php #xml #кодировка символов #simplexml
Вопрос:
У меня возникают проблемы с синтаксическим анализом строки xml с помощью simplexm_load_string. Черт возьми, я не могу понять, где я ошибся в этом скрипте.
<?php
header('Content-Type: text/html; charset=utf-8');
$string = <<<XML
<?xml version='1.0' encoding='UTF-8'?>
<document>
<title>ÄÖÜ</title>
</document>
XML;
$xml = simplexml_load_string($string);
print_r($xml);
?>
Комментарии:
1. Что произойдет, если вы используете
simplexml_load_string(utf8_encode($string));
тот же результат?2. Это сделало свое дело! Большое вам спасибо!
3. @Martin: это должно было быть только для анализа. Теперь, когда вы знаете, что это работает, просто удалите это
ut8_encode
снова и сохраните файл в кодировке UTF-8. Тогда вы действительно закончили.
Ответ №1:
Черт возьми, я не могу понять, где я ошибся в этом скрипте.
Поскольку вы не сохраняете файл PHP как UTF-8, вы не можете использовать строку в нем:
$string = <<<XML
<?xml version='1.0' encoding='UTF-8'?>
<document>
<title>ÄÖÜ</title>
</document>
XML;
в кодировке UTF-8. Сохраните файл как UTF-8, и он работает.
Если вы не уверены, вы также можете поступить по-другому:
<?php
header('Content-Type: text/html; charset=utf-8');
$string = <<<XML
<?xml version='1.0' encoding='UTF-8'?>
<document>
<title>xC3x84xC3x96xC3x9C</title>
</document>
XML;
$xml = simplexml_load_string($string);
print_r($xml);
Это делается путем указания двоичных байтов из расширенной панели в двоичной нотации PHP, чтобы они были защищены от разных кодировок в этой части октетов. Это было бы довольно надежно.
Но подумайте о сохранении ваших PHP-файлов в кодировке UTF-8. Обычно это лучшая практика в веб-разработке.
Демонстрация: https://eval.in/private/76c12983305e81
Комментарии:
1. Спасибо вам обоим за вашу помощь — оба способа сработали, но вы указали мне правильное направление — по-видимому, Notepad был настроен мной неправильно.
2. Будьте осторожны при сохранении как UTF-8: НИКОГДА с BOM. Обычный UTF-8, без спецификации. Я знаю, что Notepad (как и любой хороший текстовый редактор) может делать и то, и другое, поэтому вам нужно быть осторожным здесь.
3. тогда все хорошо. только что была неделя, эти спецификации могут стать довольно трудными для обнаружения.
Ответ №2:
Попробуйте использовать:
simplexml_load_string(utf8_encode($string))
Комментарии:
1. Скорее всего, файл имеет кодировку не Latin-1, а Win-1252. таким образом, этот ответ, хотя он может быть хорошим предположением и поначалу кажется, что он работает, может просто оказаться неправильным. Это также не объясняет причину проблемы и не объясняет, как ее исправить уже с самим файлом.
2. @hakre конечно, конечно, это правда, без сомнения, вы правы.