Варианты:
Если работаешь с PHP5, вызывай не так:
$xml_parser = xml_parser_create();
---
а так:
$xml_parser = xml_parser_create('');
---
Или делай так:
$rx = '/<?xml.*encoding=['"](.*?)['"].*?>/m';
if (preg_match($rx, $source, $m)) {
$encoding = strtoupper($m[1]);
} else {
$encoding = "UTF-8";
}
if($encoding == "UTF-8"|$encoding == "US-ASCII"|$encoding == "ISO-8859-1") {
$parser = xml_parser_create($encoding);
} else {
if(function_exists('mb_convert_encoding')) {
$encoded_source = @mb_convert_encoding($source, "UTF-8", $encoding);
}
if($encoded_source != NULL) {
$source = str_replace ( $m[0],'<?xml version="1.0" encoding="utf-8"?>', $encoded_source);
}
$parser = xml_parser_create("UTF-8");
}
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
---
Очень интересная статья про libxml, expat, PHP4, PHP5 и разные чарсеты здесь:
http://minutillo.com/steve/weblog/2004/6/17/php-xml-and-character-encodings-a-tale-of-sadness-rage-and-data-loss
Желаю удачи. Проблема в том что у expat проблемы с "угадываньем" кодировок. Тебя подвело то что на первом серваке всё работало. НЕ знаю что это была за конфигурация - винды с микрософтовским libxml или линукс с установленными пакетами поддержки разных языков. В общем рекомендую использовать принудительную перекодировку в UTF-8 во избежание будущих проблем. И дополнительно принять решение: либо тестировать на PHP4 и PHP5 либо выбрать одну поддерживаемую платформу и держаться её (вставить в начало этого модуль чек версии).
|