Я работаю над этим проектом, где получаю разные файлы XML из разных источников. Мой PHP-скрипт должен читать их, анализировать и сохранять в базе данных mysql.
Для разбора файлов XML я использую класс SimpleXMLElement в PHP. Я получаю файлы из Бельгии в кодировке UTF-8, из Германии в кодировке iso-8859-1, из Чехии в кодировке cp1250 и так далее...
Когда я передаю данные xml в SimpleXMLElement и печатаю asXML() для этого объекта, я правильно вижу данные xml, как это было в исходном файле xml. Когда я пытаюсь присвоить поле PHP-переменной и вывести эту переменную на экран, текст выглядит поврежденным и, конечно же, поврежденным при вставке в базу данных mysql.
Пример:
XML:
<?xml version="1.0" encoding="cp1250"?>
...
<name>Labe Dìèín - Rozb 741,85km ; Dìèín - Rozb 741,85km </name>
...
PHP-код:
$sxml = file_get_contents("test.xml");
$xml = new SimpleXMLElement($sxml);
//echo $xml->asXML() . "\n"; // content will show up correctly in the shell
$name = (string)$xml->ftm->fairway_section->geo_object->name;
echo $name . "\n";
Результат кода (в оболочке linux bash) перемещает курсор вверх, а затем печатает: bÃn - Rozb 741,85km ; DÄ (движение курсора, конечно, связано с неправильными символами, которые печатает PHP)
Я думаю, что PHP преобразует свои данные в UTF-8, чтобы сохранить их в строковом параметре, поэтому я предположил, что использование mb_convert_encoding для преобразования из UTF-8 в cp1250 покажет правильный результат, но это не так. Также я должен иметь возможность хранить данные в формате, совместимом со всеми другими источниками.
Я мало что знаю о кодировках/кодовых страницах, возможно, поэтому я не могу заставить его работать правильно, но я знаю, что если я скопирую/вставлю тексты с разных языков, например, в новый файл UltraEdit , все они отображаются правильно. Как UltraEdit справляется с этим? Использует ли он UTF-8 (который, я полагаю, может что-то показать?)
Как я могу преобразовать свои данные, чтобы они всегда отображались в любой кодировке источника?