Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Проблемы с кодировкой


Автор: mario315 19.1.2010, 13:57
Задача
необходимо брать материал из одной базы данных(DB1)
и занести во вторую базу данных(DB2) через html-форму

кодировки
DB1 - utf8_general_ci 
DB2 - cp1251_general_ci
кодировка страницы формы - cp1251

пробовал так
Код

use WWW::Mechanize;
use Encode;
use DBI;

$dbh = DBI -> connect"dbi:mysql:basename:localhost", $username, $pass);
 $sqlstatment = "SELECT `val1`, `val2` FROM `table`";
 $sth = $dbh -> selectall_arrayref($sqlstatment);
           foreach  $arr(@$sth) {
           $val1 = @$arry[0];
               $val2 = @$arrry[1];
}

$mech = WWW::Mechanize -> new();
$mech -> get("html://somesite.ru");
$mech -> submit_form(
                            form_number => 1,
                            fields => {
                                field1 => $val1,
                                field2 => $val2,
                            }
                 );


пробовал
Код

$val1 = encode('cp1251', decode('utf8', $val1));
$val2 = encode('cp1251', decode('utf8', $val2));


в итоге в BD2 получается что-то вроде
Код
ÂÀÇ
  либо  
Код
????


что тут можно сделать

Автор: krypt3r 19.1.2010, 14:20
Код

use Encode qw /from_to/;
from_to ($string, 'UTF-8', 'CP1251');

Автор: mario315 19.1.2010, 14:26
krypt3r,  так получаются ????

Автор: shamber 19.1.2010, 14:46
mario315, а проверить?

Автор: mario315 19.1.2010, 15:47
shamber, проверил. В базу данных заносится ???

Автор: Vaneska 19.1.2010, 17:44
Можно попробовать сделать так:
Код

use strict;
use DBI;

$dbh1 = DBI -> connect"dbi:mysql:basename:localhost", $username, $pass);
$dbh1->do("set names cp1251");

$dbh2 = DBI -> connect"dbi:mysql:basename:localhost", $username, $pass);
$dbh1->do("set names cp1251");


Т.е. идея в том, чтобы мускул сам перекодировал обе бд в одну кодировку.



Автор: mario315 19.1.2010, 19:45
Если выводить значения $val1 и $val2 на печать, кодировка 'cp1251';
Если вбивать значения вручную в форму, то тоже с кодировкой все нормально.
Путаница происходит при передачи значений из perl-скрипта к форме
Код

$mech = WWW::Mechanize -> new();
$mech -> get("html://somesite.ru");
$mech -> submit_form(
                            form_number => 1,
                            fields => {
                                field1 => $val1,
                                field2 => $val2,
                            }
 );

, но ума не приложу, что тут может быть не так

Автор: LuxInTenebris 19.1.2010, 19:50
При чтении/записи БД через DBI для хранения данных Perl использует свою внутреннюю кодировку (Unicode), независимо от той, что стоит у вас в самой БД. Так что значения $val1 и $val2 после чтения будут именно в ней.
С помощью Encode берёте и кодируете их в кодировку для вашей HTML формы:
Код
field1 => encode("windows-1251", $val1)


И вообще, имхо, для простой отправки данных лучше использовать LWP::UserAgent вместо WWW::Mechanize. Задайте только правильный HTTP метод и имена полей формы.

Автор: mario315 19.1.2010, 20:12
LuxInTenebris
Код

 $mech -> submit_form(
                            form_number => 1,
                            fields => {
                                text => encode("windows-1251", $val)

                        }
                 );
$content = $mech -> content;

так вместо букв вылезают вопросы. 
Я думаю дело не в этом, потому что если сохранять в файл, то кодировка cp1251

Раньше-то, вроде, работало. Я недавно систему переустанавливал вместе со всеми программами.
Раньше стоял Perl 5.8...., а теперь Perl 5.10.1. Это не может быть причиной?

Добавлено через 6 минут и 59 секунд
Цитата(LuxInTenebris @  19.1.2010,  19:50 Найти цитируемый пост)
для простой отправки данных лучше использовать LWP::UserAgent
 а пример можно

Автор: mario315 19.1.2010, 20:32
пример можно:
Код

use LWP::UserAgent;


my $text = "огромное описание";
my $url = "http://localhost/test/encodpoblem.php";
$ua = LWP::UserAgent->new;
my $req = HTTP::Request->new(POST=>$url);
$req->content_type('application/x-www-form-urlencoded');
$req->content("text=$text");
my $res = $ua->request($req);

так, вроде, работает  smile

Добавлено через 6 минут и 4 секунды
LuxInTenebris, спасибо за пинок в нужном направлении smile 

Автор: shamber 19.1.2010, 21:56
а еще есть use encoding;

Автор: LuxInTenebris 19.1.2010, 22:39
mario315, ваш код
Код
my $req = HTTP::Request->new(POST=>$url);
$req->content_type('application/x-www-form-urlencoded');
$req->content("text=$text");
my $res = $ua->request($req);

можно легко сократить до одной строки
Код
my $res = $ua->post($url, [ 'text' => $text ]);

Автор: mario315 19.1.2010, 22:44
shamber, попробовал use encoding 'cp1251'; - результат каракули smile 

Автор: mario315 19.1.2010, 23:00
LuxInTenebris, все отлично работает. Спасибо большое.

Автор: mario315 20.1.2010, 21:16
А как с помощью LWP отправить файл?


Вот так работает
Код

$url = "http://somesite.php";
$text = "bla bla bla";
$file = "img.jpg";
 my $res = $ua->post($url,
                         Content_Type => 'form-data',
                                Content => [
                                text => $text,
                                    img => [$file],
                                    ],

                        );


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)