Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | | | | | | | |
Варианты: 01.12.06 14:32 Число просмотров: 3449
Автор: NKritsky <Nickolay A. Kritsky> Статус: Elderman
|
Варианты:
Если работаешь с 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 либо выбрать одну поддерживаемую платформу и держаться её (вставить в начало этого модуль чек версии).
|
<sysadmin>
|
кто нть сталкивался с настройкой под freebsd парсера xml? как побороть windows-1251? 29.11.06 19:30
Автор: hamstr Статус: Незарегистрированный пользователь
|
|
|
Мало информации. Что за прасер? В чем проблема c win-1251? 29.11.06 19:52
Автор: Heller <Heller> Статус: Elderman
|
|
| |
вопрос именно в настройке библиотек, а не в програмном коде,... 30.11.06 11:43
Автор: hamstr Статус: Незарегистрированный пользователь
|
вопрос именно в настройке библиотек, а не в програмном коде, поскольку это-же код на другой машине выполняется. и парсит правильно тот-же документ.
|
| |
expat. 30.11.06 11:37
Автор: hamstr Статус: Незарегистрированный пользователь
|
expat.
php скрипт создает парсер и пытается им пропарсить xml документ с кодировкой windows-1251
в результате получаю ошибку.
not well-formed (invalid token)
на первом кирилическом символе.
|
| | |
XML_ParserCreate принимает параметр 30.11.06 13:15
Автор: NKritsky <Nickolay A. Kritsky> Статус: Elderman
|
XML_ParserCreate принимает параметр
const XML_Char *encoding
---
|
| | | |
со скриптом все нормально. дело в настройке сервера... 30.11.06 14:01
Автор: hamstr Статус: Незарегистрированный пользователь
|
> XML_ParserCreate принимает параметр > > const XML_Char *encoding
> ---
со скриптом все нормально. дело в настройке сервера. поскольку это не дефолтовая настройка PHP она включается при сборке. может я чего не учел, когда PHP пересобирал.
самое интересное, что и с expat от apache и со скачанным с соайта проекта ошибка одна и тож...
у меня создалось впечатление что парсер при сборке должен знать что такое windows-1251 в частости.
но в документации пока не нашел.
может кто здесь подскажет... или опытом поделится...
|
| | | | |
Обожаю такие ответы :) Чувак, если бы у тебя было "всё... 30.11.06 14:49
Автор: NKritsky <Nickolay A. Kritsky> Статус: Elderman
|
> со скриптом все нормально. дело в настройке сервера.
Обожаю такие ответы :) Чувак, если бы у тебя было "всё нормально" со скриптом, ты не бегал бы по форумам а сидел и плевал в потолок. Что значит "всё нормально"?
|
| | | | | |
Обожаю такие советы. 30.11.06 17:58
Автор: hamstr Статус: Незарегистрированный пользователь
|
> > со скриптом все нормально. дело в настройке сервера. > > Обожаю такие ответы :) Чувак, если бы у тебя было "всё > нормально" со скриптом, ты не бегал бы по форумам а сидел и > плевал в потолок. Что значит "всё нормально"? Обожаю такие советы.
Чувак! Я же написал в этой ветке, что ЭТОТЖЕ скрипт БЕЗ ИЗМЕНЕНИЙ читает ТОТЖЕ xml файл но в другом програмном окружении без ошибок.
|
| | | | | | |
ОК. не буду занудствовать и напоминать тебе про старину... 30.11.06 22:12
Автор: NKritsky <Nickolay A. Kritsky> Статус: Elderman
|
ОК. не буду занудствовать и напоминать тебе про старину Мерфи :) Давай попробуем решить твою проблему. Ты можешь выложить следуещее:
1. Кусок кода работы с XML. От первой xml-related функции, до той где происходит ошибка.
2. phpinfo сервера где работает "правильный код"
3. phpinfo сервера где не работает "правильный код".
Если phpinfo слишком большие, можно взять оттуда только куски где говорится о xml ,expat,charset, encoding, char,version
?
|
| | | | | | | |
$insideitem = false; 01.12.06 01:08
Автор: hamstr Статус: Незарегистрированный пользователь
|
$insideitem = false;
$tag = "";
$title = "";
$description = "";
$link = "";
function startElement($parser, $name, $attrs) {
global $insideitem, $tag, $title, $description, $link;
if ($insideitem) {
$tag = $name;
} elseif ($name == "ITEM") {
$insideitem = true;
}
}
function endElement($parser, $name) {
global $insideitem, $tag, $title, $description, $link;
if ($name == "ITEM") {
printf("<dt><a href='%s'>%s</a></dt>",
trim($link),htmlspecialchars(trim($title)));
printf("<dd>%s</dd>",htmlspecialchars(trim($description)));
$title = "";
$description = "";
$link = "";
$insideitem = false;
}
}
function characterData($parser, $data) {
global $insideitem, $tag, $title, $description, $link;
if ($insideitem) {
switch ($tag) {
case "TITLE":
$title .= $data;
break;
case "DESCRIPTION":
$description .= $data;
break;
case "LINK":
$link .= $data;
break;
}
}
}
$MODUL["dir"]["xml"]='http://www*****ru/price/m.xml';
$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
$fp = fopen($MODUL["dir"]["xml"],"r")
or die("Error reading RSS data.");
while ($data = fread($fp, 4096))
xml_parse($xml_parser, $data, feof($fp))
or die(sprintf("XML error: %s at line %d column %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser),
xml_get_current_column_number($xml_parser)));
fclose($fp);
xml_parser_free($xml_parser);
|
| | | | | | | | |
Варианты: 01.12.06 14:32
Автор: NKritsky <Nickolay A. Kritsky> Статус: Elderman
|
Варианты:
Если работаешь с 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 либо выбрать одну поддерживаемую платформу и держаться её (вставить в начало этого модуль чек версии).
|
| | | | | | | | | |
однако mbstring в сборку php включить пришлось ;-) 07.12.06 19:05
Автор: hamstr Статус: Незарегистрированный пользователь
|
|
| | | | | | | | | |
Спасибо. Очень ценная помощь. Все заработало. ;-) 07.12.06 19:04
Автор: hamstr Статус: Незарегистрированный пользователь
|
|
| | | | | | | |
спасибо за понимание ;-) 01.12.06 00:59
Автор: hamstr Статус: Незарегистрированный пользователь
|
и спасибо за уделенное внимание
я могу это выложить... только прежде вот чего...
с libexpat собирается валидатор xml
xmlwf и я проверил им xml файл
так вот чего он на строку
<?xml version="1.0" encoding="windows-1251"?> пишет
n.xml:1:30: unknown encoding
а если сделать iconv -f windows-1251 -t utf-8
потом в первой строке xml файла поменять кодировку на utf-8
и дать на вход скрипту - все парсится.
|
| | | | | | |
5 копеек - все таки в коде... 30.11.06 19:18
Автор: whiletrue <Роман> Статус: Elderman
|
Код наврное под старую какую-то версию PHP оптимизирован... Не может такого быть?
|
|
|