PHP: простой XML и разные кодовые страницы и правильное получение данных - PullRequest
1 голос
/ 10 февраля 2011

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

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

Ответы [ 2 ]

2 голосов
/ 10 февраля 2011

Попробуйте iconv вместо:

$str = iconv('UTF-8', 'WINDOWS-1250', $str);
0 голосов
/ 10 февраля 2011

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

Ближайший символ - U + 00ED (LATIN SMALL LETTER I WITH ACUTE).

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

...