Base64 - это метод для кодирования 8-битных двоичных данных с использованием 7-битных / US-ASCII-символов. После декодирования Base64 у вас должен быть стандартный файл XML.
Возможно, этот XML-файл содержит недопустимые символы или неправильно указывает кодировку символов, которую он использует.
Вы упомянули À
, специфичное для HTML (не XML) представление & Agrave ;. Если XML содержит строку в кодировке HTML À
, в XML также должна быть ссылка на таблицу сущностей, указывающую, как декодировать эту строку.
В качестве альтернативы, если ваш XML содержит & Agrave; непосредственно символ, закодированный с использованием (например) набора символов ISO-8859-1, либо код XML должен указывать эту кодировку (<?xml version="1.0" encoding="ISO-8859-1"?>
), либо вы должны указать его самостоятельно при декодировании.
В противном случае синтаксический анализатор может предположить (например, кодирование UTF-8) и потерпит неудачу при попытке декодировать & Agrave;.
Точное сообщение об ошибке должно сказать вам, в чем проблема.
[обновление: & Agrave; непосредственно]:
Похоже, что XML неверен; что они говорят UTF-8, но на самом деле используют другую кодировку. Проверьте байты XML (после декодирования base 64) для этого; если & Agrave; кодируется как один байт, это определенно не UTF-8.
[обновление: как исправить?] Если они неправильно указывают его в заголовке XML, им действительно следует заменить ложный заголовок (<?xml version="1.0" encoding="UTF-8"?>
) на правильный (<?xml version="1.0" encoding="windows-1252"?>
).
Если они ничего не указывают, похоже, что функция iconv может быть вашим лучшим выбором. Мне это действительно не нужно, поэтому я не уверен на 100% в этом, но похоже, что вы можете использовать: $ data = iconv ("ISO-8859-1", "UTF-8", $ data) после base64_decode и перед строкой simplexml_load_string. Я не знаю, как указать кодировку напрямую при декодировании XML.
Я не очень разбираюсь в особенностях PHP кодировки символов, поэтому я не даю никаких гарантий ...