Forum Webscript.Ru

Программирование => Perl => Тема начата: lamerz от 19 Января 2007, 11:32:34

Название: Парсер Xml
Отправлено: lamerz от 19 Января 2007, 11:32:34


use LWP::Simple;
use XML::LibXML;
use Text::Iconv;
use Mysql;
require \'connect.pl\';

my $dbh = DBconnect();


# Выполнение запроса
$dbh->do("$insert") || die(print"Mysql error: $DBI::errstr\\n");

my $converter = Text::Iconv->new("utf-8", "windows-1251");

#my $XMLTEXT=get(\'http://mixmarket.biz/mixmldirect.plx?id=4294967238\');
#if(!$XMLTEXT){warn ("Проблемы с $XMLURL");exit;}

my $parser = XML::LibXML->new();
my $doc=$parser->parse_file(\'xml/TEMP.xml\');
my $results = $doc->findnodes(\'//categories/category\');
foreach my $node ($results->get_nodelist)
{

#пробовал и так
 my $text = decodeFromUTF8(\'windows-1251\',$node->textContent);

#и так тоже
#my $text = $converter->convert($node->textContent());

 my @attrs=$node->attributes();
 my (%attr,%TAGS)=();
 foreach (@attrs)
 {
  $attr{$_->getName()}=$_->getValue();
 };


## Формируем запрос
my $insert = "INSERT INTO category VALUES (".$attr{id}.",\'".$attr{parentId}."\',\'".$text."\')";
## Выполнение запроса
$dbh->do("$insert");

}




Проблема моя в том что после insert в базе вмеcто русских букв хрень типа иероглифов:(

но если сделать print в браузер все ok

в чем проблема?

--------------------------
и тишина:)

Може я вопрос задал тупо или что?
Название: Парсер Xml
Отправлено: sickboy от 19 Января 2007, 12:23:30
сделайте из mysql консоли
\\s
и
show create table category
Название: Парсер Xml
Отправлено: lamerz от 19 Января 2007, 12:29:09
CHARSET=cp1251

Если Вы про локаль.
Название: Парсер Xml
Отправлено: NeoNox от 19 Января 2007, 12:34:47
use locale;
use POSIX qw(locale_h);
setlocale(LC_ALL, "ru_RU.CP1251");

в самый вверх.

Еще было-бы неплохо знать кодировку TEMP.xml
Название: Парсер Xml
Отправлено: lamerz от 19 Января 2007, 12:55:27
Цитировать
NeoNox:
use locale;
use POSIX qw(locale_h);
setlocale(LC_ALL, "ru_RU.CP1251");

в самый вверх.

Это сделал но не помогает:(

Еще было-бы неплохо знать кодировку TEMP.xml


Кодировка в основном указана как

но я так понимаю что может и ошибочная.

Да еще пробовал парсить через самописный парсер
все нормално в базу забивает.
Название: Парсер Xml
Отправлено: NeoNox от 19 Января 2007, 13:00:31
С выставленной локалью не помогло?

установи cyrillic

use cyrillic qw/convert detect/;

print detect $text;
Название: Парсер Xml
Отправлено: lamerz от 19 Января 2007, 13:51:51
установил Cyrillic,

а как им пользоваться?

Чето у меня не как не выходит.
Название: Парсер Xml
Отправлено: NeoNox от 19 Января 2007, 14:13:15
Не Cyrillic а cyrillic
http://backpan.cpan.org/modules/by-module/namespace/AMICHAUER/cyrillic-2.09.tar.gz

как использовать я выше написал.

Два раза спросил про выставленную локаль, третий спрашивать не буду, но и помогать дальше тоже.
Название: Парсер Xml
Отправлено: lamerz от 19 Января 2007, 14:24:29
Цитировать
NeoNox:
Не Cyrillic а cyrillic
http://backpan.cpan.org/modules/by-...lic-2.09.tar.gz

как использовать я выше написал.

Два раза спросил про выставленную локаль, третий спрашивать не буду, но и помогать дальше тоже.


1)Локаль не помогла я вроде уже выше написал.

2)именно его я и поставил,

как я понял detect определяет кодировку?

а далее что?

3)Ну и ладно буду сам парится, спасибо.
Название: Парсер Xml
Отправлено: NeoNox от 19 Января 2007, 14:29:46
1) ГДЕ?! В скрипте выставил?
2) именно, detect определяет кодировку.
дальше, поведайте что сказал detect на строку из файла.
3) спокойнее
Название: Парсер Xml
Отправлено: lamerz от 19 Января 2007, 14:38:12
Локаль в самом верху как обычно.

detect сказал 1251

дышу ровно:)
Название: Парсер Xml
Отправлено: NeoNox от 19 Января 2007, 14:42:53
Отлично, вот видишь, проблема локализована. Слегка.
А теперь сделай выборку из базы и этим же самым detect узнай кодировку(не забудь сюда сообщить). Похоже, проблема с модулем DBI который перекодирует в исо.
Название: Парсер Xml
Отправлено: lamerz от 19 Января 2007, 14:51:11
Не select из DBI тоже сказал 1251

хотя иероглифы вида: ìèîñòèìóëÿòîðû

мне думается что проблема порылась в LibXML


Это я ошибся сильно извеняюсь
выдает 2858
Название: Парсер Xml
Отправлено: sickboy от 19 Января 2007, 14:58:44
Попробуйте сразу после соединения с БД отправить запросы:
set character_set_client=\'cp1251\'
set character_set_results=\'cp1251\'
set collation_connection=\'cp1251_general_ci\'
Название: Парсер Xml
Отправлено: lamerz от 19 Января 2007, 15:00:07
Да это уже стоит, пробовал и убрать.
Название: Парсер Xml
Отправлено: lamerz от 19 Января 2007, 15:03:29
уже даже пробовал

#Открываем xml
open (IN,"
while ()
{

#....тут парсим регами

#далее insert в базу, все нормално влитает без иероглифов

}
Название: Парсер Xml
Отправлено: NeoNox от 19 Января 2007, 15:32:01
Хех, странно..
вот эту строку убери
my $text = decodeFromUTF8(\'windows-1251\',$node->textContent);
нет там УТФ.
Выведи перед инсертом на принт данные, какие они?
А кракозяблы похожи на win1251->koi-8->iso
Есть идея хранить в базе в юникоде, подумай об этом.
В XML::LibXML есть функция encodeToUTF8.
Название: Парсер Xml
Отправлено: lamerz от 19 Января 2007, 15:45:29
если убрать то вот что имею,

увлажнители воздуха

Наверно буду в итоге юзать самописный велосипед с регами.

От чего ушел к тому и пришел:)
Название: Парсер Xml
Отправлено: NeoNox от 19 Января 2007, 16:18:30
Ага, это чистый юникод... Значит XML::LibXML в него преобразует. Интересно. Не делай руками, это не правильно.
Далее decodeFromUTF8 не используем тоже:
Цитировать
This Function transforms an UTF-8 encoded string the specified encoding. While transforms to ISO encodings may cause errors if the given stirng contains unsupported characters, both functions can transform to UTF-16 encodings as well.


Пробуй
use cyrillic qw/utf2win detect/;
utf2win($text);
Название: Парсер Xml
Отправлено: vladsu от 19 Января 2007, 16:35:15
На сколько мне помнится весе модули работы с XML после открытия файла конвертят в UTF.
Название: Парсер Xml
Отправлено: lamerz от 19 Января 2007, 17:26:08
Пустые строки вместо text
Название: Парсер Xml
Отправлено: NeoNox от 19 Января 2007, 17:37:29
Код покажи.
Название: Парсер Xml
Отправлено: NeoNox от 19 Января 2007, 17:48:00
Вариант с Encode

use Encode;
Encode::from_to($text, "utf8", "cp1251");
Название: Парсер Xml
Отправлено: lamerz от 19 Января 2007, 17:49:16


use locale;
use POSIX qw(locale_h);
setlocale(LC_ALL, "ru_RU.CP1251");

use LWP::Simple;
use XML::LibXML;
use Text::Iconv;
use cyrillic qw/utf2win detect/;


use DBI;
require \'includes/submix.pl\';

my $dbh = DBconnect();

$dbh->do("delete from category");

#my $converter = Text::Iconv->new("utf-8", "windows-1251");

print "Content-type: text/html\\n\\n";

#my $XMLTEXT=get(\'http://mixmarket.biz/mixmldirect.plx?id=4294967238\');
#if(!$XMLTEXT){warn ("Проблемы с $XMLURL");exit;}

my $parser = XML::LibXML->new();
my $doc=$parser->parse_file(\'xml/TEMP.xml\');
my $results = $doc->findnodes(\'//categories/category\');
foreach my $node ($results->get_nodelist)
{
 #my $text = decodeFromUTF8(\'windows-1251\',$node->textContent);
 #my $text = $converter->convert($node->textContent());
 my $text =utf2win($node->textContent());

 my @attrs=$node->attributes();
 my (%attr,%TAGS)=();
 foreach (@attrs)
 {
  $attr{$_->getName()}=$_->getValue();
 };


## Формируем запрос
$dbh->do("INSERT INTO category VALUES (".$attr{id}.",\'".$attr{parentId}."\',\'".$text."\')");

#Вывод в Бр...
print "$attr{id}|$attr{parentId}|$text\\n
";
}

Название: Парсер Xml
Отправлено: NeoNox от 19 Января 2007, 18:00:39
Вариант с Convert::Cyrillic

use Convert::Cyrillic;

$text = Convert::Cyrillic::cstocs(\'UTF8\', \'WIN\', $text)
Название: Парсер Xml
Отправлено: lamerz от 19 Января 2007, 18:03:43
Спасибо Вам огромное что помогали, буду завтра пробовать на другой машине чтоб узнать вдруг эти глюки только у меня.
Название: Парсер Xml
Отправлено: lamerz от 22 Января 2007, 13:11:38
Все четно, на другой машине и на другом хостинге тоже самое, я здаюсь LibXml меня победил:)