Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с кодировкой, на входе utf8, на выходе крякозябры 
:(
    Опции темы
mario315
Дата 19.1.2010, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 24.1.2009

Репутация: нет
Всего: нет



Задача
необходимо брать материал из одной базы данных(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 получается что-то вроде
Код
ÂÀÇ
  либо  
Код
????


что тут можно сделать
PM MAIL   Вверх
krypt3r
Дата 19.1.2010, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 9.6.2009

Репутация: 2
Всего: 16



Код

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

PM MAIL   Вверх
mario315
Дата 19.1.2010, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 24.1.2009

Репутация: нет
Всего: нет



krypt3r,  так получаются ????
PM MAIL   Вверх
shamber
Дата 19.1.2010, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



mario315, а проверить?
PM MAIL Jabber   Вверх
mario315
Дата 19.1.2010, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 24.1.2009

Репутация: нет
Всего: нет



shamber, проверил. В базу данных заносится ???
PM MAIL   Вверх
Vaneska
Дата 19.1.2010, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 15.3.2005
Где: Москва

Репутация: 3
Всего: 4



Можно попробовать сделать так:
Код

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");


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



--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
mario315
Дата 19.1.2010, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 24.1.2009

Репутация: нет
Всего: нет



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

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

, но ума не приложу, что тут может быть не так
PM MAIL   Вверх
LuxInTenebris
Дата 19.1.2010, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 22.2.2009

Репутация: нет
Всего: нет



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


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

Это сообщение отредактировал(а) LuxInTenebris - 19.1.2010, 19:53
PM MAIL   Вверх
mario315
Дата 19.1.2010, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 24.1.2009

Репутация: нет
Всего: нет



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
 а пример можно

PM MAIL   Вверх
mario315
Дата 19.1.2010, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 24.1.2009

Репутация: нет
Всего: нет



пример можно:
Код

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 
PM MAIL   Вверх
shamber
Дата 19.1.2010, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



а еще есть use encoding;
PM MAIL Jabber   Вверх
LuxInTenebris
Дата 19.1.2010, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 22.2.2009

Репутация: нет
Всего: нет



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 ]);


Это сообщение отредактировал(а) LuxInTenebris - 19.1.2010, 22:40
PM MAIL   Вверх
mario315
Дата 19.1.2010, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 24.1.2009

Репутация: нет
Всего: нет



shamber, попробовал use encoding 'cp1251'; - результат каракули smile 
PM MAIL   Вверх
mario315
Дата 19.1.2010, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 24.1.2009

Репутация: нет
Всего: нет



LuxInTenebris, все отлично работает. Спасибо большое.

Это сообщение отредактировал(а) mario315 - 19.1.2010, 23:11
PM MAIL   Вверх
mario315
Дата 20.1.2010, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 24.1.2009

Репутация: нет
Всего: нет



А как с помощью 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],
                                    ],

                        );



Это сообщение отредактировал(а) mario315 - 20.1.2010, 21:57
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1292 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.