powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl LWP::UserAgent и utf-8
5 сообщений из 5, страница 1 из 1
Perl LWP::UserAgent и utf-8
    #39014301
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть у меня такой код:
Код: php
1.
2.
3.
4.
5.
6.
7.
use Encode;
use LWP::UserAgent;
use HTTP::Request;
my $req = HTTP::Request->new;
my $ua = LWP::UserAgent->new('timeout'=>15, 'ssl_opts'=>{'verify_hostname'=>0});
my $res = $ua->request($req);
print decode('utf-8', $res->decoded_content);


А можно ли получить ответ от сервера сразу в UTF?
Я пробовал задать кодировку в decoded_content ('charset'=>"utf-8"), но какой-либо разницы не заметил.
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
Perl LWP::UserAgent и utf-8
    #39014978
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно, если сервер умеет.
...
Рейтинг: 0 / 0
Perl LWP::UserAgent и utf-8
    #39015121
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Э...
Сервер умеет и возвращает именно utf-8.
Но LWP::UserAgent (или, скорее, HTTP::Response) об этом не догадывается и не возвращает строку, как UTF.
Вот результат $res->decoded_content:
Код: plaintext
$VAR1 = 'i»?{"responseObject":"","message":"?N?¶??N?? ???±N?°?±??NN???? ???»N ?·?°??N??N?° \\"cluster\\"???µ ???°?????µ??, ?????·?????¶???? ?·?°??N??N N??NN?°???»?µ?? ???µ ??N?°?????»N????.","errorCode":3,"isSuccess":false}
То есть содержание строки в UTF-8, но флаг utf8 не установлен и Perl отображает результат нечитаемым.
Если же использовать decode, то результат читаем:
Код: plaintext
$VAR1 = '?{"responseObject":"","message":"Нужный обработчик для запроса \"cluster\"не найден, возможно запрос составлен не правильно.","errorCode":3,"isSuccess":false}';

А можно ли обойтись без decode, чтобы в $res содержимое было уже в правильной кодировке и с правильными флагами?
...
Рейтинг: 0 / 0
Perl LWP::UserAgent и utf-8
    #39015778
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кароче!

Во первых, у нас есть два слоя: http протокол и поверх него перловые библиотеки.

На уровне HTTP:
Ты не можешь затребовать от сервера "дай мне документ в такой-то кодировке". Ты можешь сказать серверу что "я предпочту получить документ в таких-то кодировках". Для этого используется заголовок http запроса Accept-Charset. В Перле ты будешь задавать этот список в $req->header('Accept-Charset' => 'utf-8, cp1251, еще-чего-то');
Сервер может запросто игнорировать Accept-Charset запрос и отдавать документ как умеет или хочет.
Если сервер решит удовлетворить Accept-Charset запрос, но не сможет сконвертировать текст в то что просили - ты получишь документ в том что сервер смог послать (обычно это то в чем документ хранится изначально). Если сервер смог удовлетворить запрос и конвертировал текст в нужный формат - то ты и получишь в http ответе заказанную кодировку.
В любом случае (удовлетворил или нет) сервер укажет ( если захочет ) кодировку ответа вторым параметром в заголовке Content-Type. И да, сервер может это не указать или вообще соврать.
Это то что касается самого HTTP и ручной работы с ним.

Поднимаемся на уровень перловых библиотек:
В $res->content находится текст в той самой кодировке которую выдал сервер. Ты сможешь узнать какая это именно кодировка читая $res->header('Content-Type'). (однако помним что сервер может не указать кодировку вообще или соврать)
Ты можешь вручную конвертировать ответ из кодировки указанной сервером в любую другую, но тут у тебя есть помощь в виде $res->decoded_content. Там хранится уже конвертированный текст ответа, из той кодировки которую указал сервер в ту кодировку которую ты указал своей стандартной локалью. Читай perldoc perllocale.

Поэтому для упрощения жизни:
Ты можешь либо указывать Accept-Charset при формировании запроса и напрямую использовать $res->content (и надеяться что сервер удовлетворил твое пожелание).

Либо не указывать Accept-Charset а всегда использовать $res->decoded_content (предполагается что у тебя правильно настроена локаль).

Либо читать (или догадываться) о кодировке ответа на основе Content-Type и вручную конвертировать ответ из $res->content в ту кодировку которую тебе нужно.


Все понял?
...
Рейтинг: 0 / 0
Perl LWP::UserAgent и utf-8
    #39015924
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
decoded_content у меня отрабатывает нормально.
Заголовки (Accept-Charset) я передавал, они ничего не изменили (скорее всего веб-сервер их игнорирует).
Скорее всего проблема была вызвана тем, что в ответе есть BOM.
Такая конструкция:
Код: plaintext
decode_json(remove_bom($res->decoded_content))
проблему решает, в результате я получаю читаемый текст.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl LWP::UserAgent и utf-8
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]