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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка encode при декодировании из utf8 
V
    Опции темы
alezzz
Дата 15.4.2011, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


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

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



Получаю ответ на LWP::Simple get. Ответ в виде XML, и в нем есть кирилица в utf8. Делаю encode И получаю
Цитата

Cannot decode string with wide characters at C:/Perl/lib/Encode.pm line 174.

Пробовал регуляркой вырезать только нужный текст из XML  и его уже перекодировать, но тоже самое.
декодирую так:
Код

my $fromutf8 = encode("cp1251", decode("utf8", $content));

PM MAIL   Вверх
arto
Дата 15.4.2011, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



# GET "http://forum.vingrad.ru/index.php?showtopic=327136" | perl -MEncode=encode,decode -lne 'encode("cp1251", decode("utf8", $_)) =~ m#<title>.+?</title>#smi && print $&'
<title>VPF::Ошибка encode при декодировании из utf8 - Форум программистов</title>

вы уверены в утфности текста?
PM MAIL ICQ   Вверх
IceSunrise
Дата 15.4.2011, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



alezzz,  ошибка возникает при декодировании
Это должно работать, если в $content действительно utf8
Код

$octets = encode_utf8($content);
from_to($octets, 'utf-8', 'cp1251');


Если не сработает, запостите сюда дамп переменной $content до перекодирований. Вот так
Код

use Data::Dumper;
print Dumper($content);


Это сообщение отредактировал(а) IceSunrise - 15.4.2011, 11:49
PM MAIL   Вверх
alezzz
Дата 15.4.2011, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


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

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



Цитата(arto @  15.4.2011,  11:41 Найти цитируемый пост)
вы уверены в утфности текста?

да, сайт возвращает XML с кирилицей в утф

Я пробовал сделать принт до декодирования, получил такое:
Цитата

Wide character in print at mor.cgi line 17


сам контент
Код

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="
http://www.w3.org/2001/XMLSchema" xmlns="http://morpher.ru/webservices/">
  <string>╨Я╤А╨╛╨│╤А╨░╨╝╨╝╨░ ╨╜╨╡ ╨╝╨╛╨╢╨╡╤В ╨┐╤А╨╛╤Б╨║╨╗╨╛╨╜╤П╤В╤М ╤Н╤В╨╛ ╤Б╨╗╨
╛╨▓╨╛╤Б╨╛╤З╨╡╤В╨░╨╜╨╕╨╡.</string>
</ArrayOfString>

PM MAIL   Вверх
gcc
Дата 15.4.2011, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

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



http://forum.vingrad.ru/forum/topic-282078...utf8/index.html
http://forum.vingrad.ru/forum/topic-274374/hl/utf8/15.html

Добавлено @ 12:34
для MVC Catalyst пытались сделать, чтобы оно не сбивалось в любом случае!
http://search.cpan.org/~bobtfish/Catalyst-...ode/Encoding.pm

http://cpansearch.perl.org/src/BOBTFISH/Ca...ode/Encoding.pm
Код

            for ( ref($value) ? @{$value} : $value ) {
                # N.B. Check if already a character string and if so do not try to double decode.
                #      http://www.mail-archive.com/[email protected]/msg02350.html
                #      this avoids exception if we have already decoded content, and is _not_ the
                #      same as not encoding on output which is bad news (as it does the wrong thing
                #      for latin1 chars for example)..
                $_ = Encode::is_utf8( $_ ) ? $_ : $enc->decode( $_, $CHECK );
            }



тут http://www.mail-archive.com/[email protected]/msg02350.html очень активно обсуждали
там Bill Moseley написал

Это сообщение отредактировал(а) gcc - 15.4.2011, 12:37
PM WWW ICQ Skype GTalk Jabber   Вверх
arto
Дата 15.4.2011, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



url?
PM MAIL ICQ   Вверх
alezzz
Дата 15.4.2011, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


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

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



http://morpher.ru/WebServices/Morpher.aspx

вот пример:
Код

use strict;
use URI::Escape;
use Encode;
use LWP::Simple;
 
print morpher("яблоко");

sub morpher{ 
    my $string = shift || $_; 
    my $utfstring = encode("utf8", decode("cp1251", $string));
    my $encode = uri_escape($utfstring);
    my $content = get("http://morpher.ru/Webservices/Morpher.asmx/GetForms?s=$encode");
    my $fromutf8 = encode("cp1251", decode("utf8", $content));
    my $words;
    while ($fromutf8 =~ /<string>(.*?)<\/string>/g){
        $words .= $1 . ",";
    }
    return $words;
}


и еще, дома работает без проблем, на работе не хочет, кроме WinXP/Win 7 не вижу разницы.
PM MAIL   Вверх
arto
Дата 15.4.2011, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



perl -v ?

у меня работает нормально
PM MAIL ICQ   Вверх
alezzz
Дата 15.4.2011, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


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

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



Цитата(arto @  15.4.2011,  13:42 Найти цитируемый пост)
perl -v ?

This is perl, v5.10.0 built for MSWin32-x86-multi-thread
(with 5 registered patches, see perl -V for more detail)
Цитата(arto @  15.4.2011,  13:42 Найти цитируемый пост)
у меня работает нормально

вот в этом и проблема, пытаюсь понять что не так. Еще:
работает - файрвол отключен
не работает - файрвол включен, но get отдает контент
работает и не работатет на разных компьютерах, перл одинаковый

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


Эксперт
***


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

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



проверьте, на чем ломается:

perldoc Encode | less -p "Handling Malformed Data"
PM MAIL ICQ   Вверх
alezzz
Дата 15.4.2011, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


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

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



Решил проблему, поменял LWP::Simple на LWP::UserAgent (когда гуглил что-то такое видел, но не обратил сразу внимания). 
Вобщем такие наблюдения: брал контент из $content->content и $content->decoded_content, если их вывести принтом то внешне ничем не отличаются, только на $content->decoded_content появляется "Wide character in print at...", зато длины строк если посмотреть через length() отличаются. 
Отправил на encode $content->content, работает нормально. 
Непонятно, функции is_utf8, _utf8_on, _utf8_off из Encode реализованы? Ругается "Undefined subroutine &main::is_utf8 ..."
PM MAIL   Вверх
arto
Дата 16.4.2011, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



импортируйте
PM MAIL ICQ   Вверх
alezzz
Дата 16.4.2011, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


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

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



Цитата(arto @  16.4.2011,  11:24 Найти цитируемый пост)
импортируйте

Точно smile
$flag = Encode::is_utf8($string);
Спасибо.


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


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

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


 




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


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

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