Jump to content
  • 0

Кодировка в PHP->XML


ket
 Share

Question

Задача: перенести на новую машину (LAMP) сайт с базами данных с машины с аналогичной системой.

Решение: Базы не большие поэтому посредством PHP были экспортированны в XML формат, результат переброшен на новую машину и импорт.. однако на этапе разборки XML часть информации исчезает, а именно запись вида

<entry>
<name>Вася Пупкин</name>
<age>20</age>
<addr>123456, деревня Кукуево...</addr>
</entry>

разбирается как

<entry>
<name>Вася Пупкин</name>
<age>20</age>
<addr>123456, </addr>
</entry>

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

реализован импорт посредством следующего PHP-кода

function importFile($fn) {
/* открываем файл */
if(!($fd = gzopen($fn, "br")))
return 1;

/* создаем парсер */
$p = xml_parser_create("UTF-8");
xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($p, XML_OPTION_SKIP_WHITE, 0);

/* настраеваем парсер */
xml_set_element_handler($p, "bTag", "eTag");
xml_set_character_data_handler($p, "xData");

/* читаем и разбираем файл блоками */
do {
$data = gzread($fd, 65536);
xml_parse($p, $data, feof($fd));
} while(!feof($fd));

/* освобождаем ресурсы */
gzclose($fd);
xml_parser_free($p);

return 0;
}

/* глобальная переменна для звязи функций обработчика */
$xmls = array();

/* обработка открытия тэга */
function bTag($p, $tag, $attr) {
global $xmls;

switch($tag) {
case "root":
break;
case "entry":
$xmls["current_tag"] = $tag;
$xmls["entry"] = array();
break;
default:
$xmls["entry"][$xmls["current_tag"]] = "";
}
}

/* обработка закрытия тэга */
function eTag($p, $tag, $attr) {
global $xmls;

switch($tag) {
case "root":
break;
case "entry":
if($xmls["entry"]) {
inser_to_db($xmls["entry"]);
}
$xmls["current_tag"] = false;
$xmls["entry"] = false;
break;
default:
$xmls["entry"][$xmls["current_tag"]] = false;
}
}

/* обработка содержимого тэга */
function xData($p, $data) {
global $xmls;
if($xmls["current_tag"])
$xmls["entry"][$xmls["current_tag"]] = $data;
}

на старой машине этот код работает нормально, а на новой при обработке содержимого тэга addr функции xData передается только "123456, ".

Новая система

altlinux-server 4

php-5.2.2

apahe-1.3.37

PHP-расширения

dom

mbstring

mcrypt

mysql

suhosin

Все настроенно на UTF-8, включая mbstring и glibc самой системы.

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

Link to comment
Share on other sites

1 answer to this question

Recommended Posts

  • 0

Разборка через DOM - может стоит попробовать организовать буффер что бы не вылетало?

еще советую обратить внимание на кодировку базы данных

у меня была схожая проблема, но немного иного плана - просто с одного хостинга перенести базу данных на другой, при импорте часть русских символов портилась, я вышел из ситуации с помощью проги, называется "Штирлиц"

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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy