Почему LWP Perl дает мне другое кодирование, чем оригинальный сайт?

StackOverflow https://stackoverflow.com/questions/2341128

Вопрос

Допустим, у меня есть этот код:

use strict;
use LWP qw ( get );

my $content = get ( "http://www.msn.co.il" );

print STDERR $content;

Журнал ошибок показывает что-то вроде « xd7 x9c xd7 x94 xd7 x93 xd7 xa4 xd7 xa1 xd7 x94», что, я предполагаю, это UTF-16?

Кодирование сайта с

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1255">

Так почему же эти символы появляются, а не Chars Windows-1255?

И еще одна странная вещь в том, что у меня есть два сервера:

Первый сервер, возвращающий CP1255 Chars, и я могу просто конвертировать его в UTF8, и текущий сервер дает мне эти Chars, и я ничего не могу с ним сделать ...

Есть ли какой -либо файл конфигурации в Apache/Perl/Module, который испортит кодирование? что -то принудительно ...?

Результат на моем веб -сайте на втором сервере заключается в том, что файл PERL и заголовки - все UTF8, поэтому, когда я пишу текст, который не является английским языком, содержимое из примера приведенного выше показывает OK (даже если это странные utf Chars ) Но мой собственный статический текст выглядит как "× × ¡'× × ¨ × ×:"

Еще одна вещь, которую я проверил, это ...

Через Perl:

my $content = `curl "http://www.anglo-saxon.co.il"`;    

Я получаю кодирование UTF8.

Через Bash:

curl "http://www.anglo-saxon.co.il"

И здесь я получаю кодирование CP1255 (Windows-1255) ...

Кроме того, когда я запускаю скрипт в Bash - он дает CP1255, и при выполнении его через Интернет - тогда это снова UTF8 ...

исправил проблему, изменяя контент от UTF8 - к тому, что должно, а затем вернемся к UTF8:

use Text::Iconv;

my $converter = Text::Iconv->new("utf8", "CP1255");
   $content=$converter->convert($content);

my $converter = Text::Iconv->new("CP1255", "utf8");
   $content=$converter->convert($content);
Это было полезно?

Решение

Строка со значениями шестигранника, которые вы дали, представляется кодировкой UTF-8. Вы получаете это, потому что Perl «любит» использовать UTF-8, когда он занимается строками. А LWP::Simple->get() Метод автоматически декодирует контент с сервера, который включает в себя отмену любого кодирования контента, а также преобразование в UTF-8.

Вы можете выкопать внутреннюю часть и получить версию, которая меняет кодирование персонажа (см. Http :: message decoded_content, который используется Http :: decoded_content response, от чего вы можете получить Lwp :: userAgent's Get) Но может быть легче повторно обожать данные в желаемом кодировании с чем-то вроде

use Encode; 
...; 
$cp1255_bytes = encode('CP1255', decode('UTF_8', $utf8_bytes));

Смешанные читаемые/мусорные символы, которые вы видите, связаны с смешиванием нескольких, несовместимых кодировков в одном потоке. Вероятно, поток помечен как UTF-8, но вы вкладываете в него символы CP1255. Вам либо нужно пометить поток как CP1255 и поместить в него только данные CP1255, либо пометить его как UTF-8 и поместить в него только данные UTF-8. Напомните себе, что байты не являются персонажами, и конвертируйте между ними соответствующим образом.

Другие советы

Просто чтобы быть уверенным, попробуйте получить значения из INTERUPDATED событие.Может быть, причина, почему значения недоступны, заключается в том, что они еще не существуют.

http://www.msn.co.il находится в UTF-8 и указывает на это правильно. Строка " xd7 x9c xd7 x94 xd7 x93 xd7 xa4 xd7 xa1 xd7 x94" также является правильной UTF-8 (להדפס всем). Я не вижу проблемы.

Я думаю, что ваша вторая проблема связана с тем, что вы смешиваете различные кодировки (UTF-8 и Windows-1252). Вы можете захотеть кодировать/декодировать ваши струны правильно.

Во -первых, обратите внимание, что вы должны импортировать get из Lwp :: Просто. Анкет Во -вторых, все работает нормально:

#!/usr/bin/perl
use strict; use warnings;
use LWP::Simple qw ( getstore );
getstore 'http://www.msn.co.il', 'test.html';

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top