Если ваша строка XML (то есть содержимое файла) имеет значение , а не , закодированное как UTF-8, вам необходимо объявление XML, которое обозначает кодировку файла. Если декларация XML отсутствует, синтаксический анализатор примет UTF-8.
Пока вы не используете «специальные» символы (т.е. что-либо вне диапазона ASCII), он будет работать без объявления, даже если ваш файл не действительно в кодировке UTF-8. Это потому, что UTF-8 является байтово-совместимым с ASCII. Но как только используются символы, которые находятся на одной из кодовых страниц - например, «умные кавычки» - они прерываются, потому что они представлены различными байтами в UTF-8.
В вашем случае есть текстовые файлы в устаревшей кодировке, которые вы оборачиваете корневым элементом, чтобы превратить их в правильно сформированный XML. Поэтому вам нужно добавить декларацию XML самостоятельно:
'<?xml encoding="Windows-1252"?><article>'.file_get_contents($xmlfile).'</article>'
Таким образом, вы указываете DOMDocument
, как интерпретировать байты в вашей строке. Я предположил Windows-1252
для вас, потому что вы сказали ANSI и упомянули фигурные кавычки.
На самом деле, 95% времени это то, что на самом деле имеют в виду люди, даже на Linux и даже если они говорят ISO-8859-1
(или latin-1
), что почти, но не точно то же самое.
Чтобы быть уверенным, что вы можете открыть свои текстовые файлы в шестнадцатеричном редакторе, найдите несколько специальных символов и сравните их значения в байтах с предполагаемой кодировкой. Для Windows-1252
. Для фигурных кавычек ожидаемые значения байтов будут:
“
147 (0x93)
”
148 (0x94)
Как только значение отдельных байтов в вашей строке объявлено, DOMDocument
может понять их и поступить правильно.
Когда дело доходит до БД, я сильно подозреваю, что происходит некоторое автоматическое преобразование кодировки. Я признаю, что недостаточно знаю об интеграции PHP / mySQL / Unicode, чтобы сказать наверняка.