Forum Webscript.Ru
Программирование => Perl => Тема начата: 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
в чем проблема?
--------------------------
и тишина:)
Може я вопрос задал тупо или что?
-
сделайте из mysql консоли
\\s
и
show create table category
-
CHARSET=cp1251
Если Вы про локаль.
-
use locale;
use POSIX qw(locale_h);
setlocale(LC_ALL, "ru_RU.CP1251");
в самый вверх.
Еще было-бы неплохо знать кодировку TEMP.xml
-
NeoNox:
use locale;
use POSIX qw(locale_h);
setlocale(LC_ALL, "ru_RU.CP1251");
в самый вверх.
Это сделал но не помогает:(
Еще было-бы неплохо знать кодировку TEMP.xml
Кодировка в основном указана как
но я так понимаю что может и ошибочная.
Да еще пробовал парсить через самописный парсер
все нормално в базу забивает.
-
С выставленной локалью не помогло?
установи cyrillic
use cyrillic qw/convert detect/;
print detect $text;
-
установил Cyrillic,
а как им пользоваться?
Чето у меня не как не выходит.
-
Не Cyrillic а cyrillic
http://backpan.cpan.org/modules/by-module/namespace/AMICHAUER/cyrillic-2.09.tar.gz
как использовать я выше написал.
Два раза спросил про выставленную локаль, третий спрашивать не буду, но и помогать дальше тоже.
-
NeoNox:
Не Cyrillic а cyrillic
http://backpan.cpan.org/modules/by-...lic-2.09.tar.gz
как использовать я выше написал.
Два раза спросил про выставленную локаль, третий спрашивать не буду, но и помогать дальше тоже.
1)Локаль не помогла я вроде уже выше написал.
2)именно его я и поставил,
как я понял detect определяет кодировку?
а далее что?
3)Ну и ладно буду сам парится, спасибо.
-
1) ГДЕ?! В скрипте выставил?
2) именно, detect определяет кодировку.
дальше, поведайте что сказал detect на строку из файла.
3) спокойнее
-
Локаль в самом верху как обычно.
detect сказал 1251
дышу ровно:)
-
Отлично, вот видишь, проблема локализована. Слегка.
А теперь сделай выборку из базы и этим же самым detect узнай кодировку(не забудь сюда сообщить). Похоже, проблема с модулем DBI который перекодирует в исо.
-
Не select из DBI тоже сказал 1251
хотя иероглифы вида: ìèîñòèìóëÿòîðû
мне думается что проблема порылась в LibXML
Это я ошибся сильно извеняюсь
выдает 2858
-
Попробуйте сразу после соединения с БД отправить запросы:
set character_set_client=\'cp1251\'
set character_set_results=\'cp1251\'
set collation_connection=\'cp1251_general_ci\'
-
Да это уже стоит, пробовал и убрать.
-
уже даже пробовал
#Открываем xml
open (IN,"
while ()
{
#....тут парсим регами
#далее insert в базу, все нормално влитает без иероглифов
}
-
Хех, странно..
вот эту строку убери
my $text = decodeFromUTF8(\'windows-1251\',$node->textContent);
нет там УТФ.
Выведи перед инсертом на принт данные, какие они?
А кракозяблы похожи на win1251->koi-8->iso
Есть идея хранить в базе в юникоде, подумай об этом.
В XML::LibXML есть функция encodeToUTF8.
-
если убрать то вот что имею,
увлажнители воздуха
Наверно буду в итоге юзать самописный велосипед с регами.
От чего ушел к тому и пришел:)
-
Ага, это чистый юникод... Значит 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 после открытия файла конвертят в UTF.
-
Пустые строки вместо text
-
Код покажи.
-
Вариант с Encode
use Encode;
Encode::from_to($text, "utf8", "cp1251");
-
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
";
}
-
Вариант с Convert::Cyrillic
use Convert::Cyrillic;
$text = Convert::Cyrillic::cstocs(\'UTF8\', \'WIN\', $text)
-
Спасибо Вам огромное что помогали, буду завтра пробовать на другой машине чтоб узнать вдруг эти глюки только у меня.
-
Все четно, на другой машине и на другом хостинге тоже самое, я здаюсь LibXml меня победил:)