PHP: простой XML и различные кодовые страницы и правильное получение данных

Я работаю над этим проектом, где получаю разные файлы 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 (который, я полагаю, может что-то показать?)

Как я могу преобразовать свои данные, чтобы они всегда отображались в любой кодировке источника?


person scippie    schedule 10.02.2011    source источник


Ответы (2)


Вместо этого попробуйте iconv:

$str = iconv('UTF-8', 'WINDOWS-1250', $str);
person netcoder    schedule 10.02.2011

Проблема в том, что ваш входной файл искажен. В Windows-1250 нет символа ì (латинская строчная буква I с запятой). См. здесь.

Ближайший символ: U+00ED. (ЛАТИНСКАЯ СТРОЧНАЯ БУКВА I С ОСТРОЙ).

Тот факт, что такой символ правильно отображается в оболочке, вероятно, является случайностью.

person Artefacto    schedule 10.02.2011