<title>Onegai My Melody Sukkiri�</title>
О, дорогой!Мало того, что это неправильный текст, это даже не правильно сформированный XML.acirc
и ordf
являются объектами HTML, которые не определены в XML, и между ними существует недопустимая последовательность UTF-8 (один старший байт, предположительно первоначально 0x99).
Проблема заключается в том, что myanimelistгенерировать их вывод «XML» (но «если он не правильно сформирован, это не XML») с использованием функции PHP htmlentities()
.Это пытается избежать HTML не только потенциально чувствительных в HTML символов <&"'
, но также и всех символов, не относящихся к ASCII.
Это создает неправильные символы, потому что PHP по умолчанию обрабатывает ввод для htmlentities()
как ISO-8859-1 вместо UTF-8, которая является кодировкой, которую они фактически используют.Но с самого начала это было неправильно, поскольку в XML не существует набора сущностей HTML.Что они действительно хотели использовать, так это htmlspecialchars()
, который оставляет символы не-ASCII в одиночестве, только избегая действительно чувствительных.Поскольку те же, что чувствительны в XML, htmlspecialchars()
работает так же хорошо для XML, как и HTML.
htmlentities()
почти всегда является неправильным;htmlspecialchars()
обычно следует использовать вместо этого.Единственное место, где вы можете захотеть кодировать байты, не относящиеся к ASCII, к ссылкам на сущности, - это когда вы ориентируетесь на чистый вывод ASCII.Но даже тогда htmlentities()
терпит неудачу, потому что он не делает ссылки на символы (&#...;
) для символов, которые не имеют предопределенных имен сущностей.Довольно бесполезно.
В любом случае, вы действительно не сможете восстановить искаженные данные из этого.�
представляет последовательность байтов, которая была UTF-8-не декодируемой для XMLHttpRequest, так что информация безвозвратно утеряна.Вам нужно будет убедить myanimelist исправить их неверный вывод XML, как указано выше в нескольких параграфах, прежде чем идти дальше.
Кроме того, они должны возвращать его как Content-Type: text/xml
, а не text/html
на данный момент.,Тогда вы можете получить responseXML
непосредственно из объекта XMLHttpRequest вместо того, чтобы возиться с DOMParsers.