Por que o LWP da Perl me dá uma codificação diferente do site original?
-
22-09-2019 - |
Pergunta
Vamos dizer que eu tenho este código:
use strict;
use LWP qw ( get );
my $content = get ( "http://www.msn.co.il" );
print STDERR $content;
O log de erros mostra algo como " xd7 x9c xd7 x94 xd7 x93 xd7 xa4 xd7 xa1 xd7 x94", que eu acho que é UTF-16?
A codificação do site está com
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1255">
Então, por que esses personagens aparecem e não os chars do Windows-1255?
E outra coisa estranha é que eu tenho dois servidores:
O primeiro servidor que retorna os chars CP1255 e eu posso simplesmente convertê -lo para o UTF8, e o servidor atual me dá esses chars e não posso fazer nada com ele ...
Existe algum arquivo de configuração no Apache/Perl/Módulo que está bagunçando a codificação? forçando algo ...?
O resultado no meu site no segundo servidor é que o arquivo Perl e os cabeçalhos são todos UTF8; portanto, quando escrevo texto que não é chars em inglês, o conteúdo do exemplo acima está mostrando OK (mesmo que seja estranho utf chars ) Mas meu próprio texto estático parece "× × '× × ¨ × ×:"
Mais uma coisa que testei é ...
Através de Perl:
my $content = `curl "http://www.anglo-saxon.co.il"`;
Eu recebo a codificação UTF8.
Através da Bash:
curl "http://www.anglo-saxon.co.il"
E aqui eu recebo cp1255 (Windows-1255) codificando ...
Além disso, quando eu corro o script em Bash - ele fornece o CP1255 e, quando o executar na web - então é UTF8 novamente ...
Corrigido o problema Change o conteúdo do UTF8 - para o que deveria e, em seguida, de volta ao 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);
Solução
A string com os valores hexadecimais que você deu parece ser uma codificação UTF-8. Você está conseguindo isso porque o Perl 'gosta de' usar o UTF-8 quando lida com strings. o LWP::Simple->get()
O método decodifica automaticamente o conteúdo do servidor, que inclui desfazer qualquer codificação de conteúdo, além de converter para o UTF-8.
Você pode cavar os internos e obter uma versão que altera a codificação do personagem (veja Http :: Message é decoded_content, que é usado por Http :: Resposta é decoded_content, de que você pode obter Lwp :: userAgent está). Mas pode ser mais fácil re-codificar os dados na codificação desejada com algo como
use Encode;
...;
$cp1255_bytes = encode('CP1255', decode('UTF_8', $utf8_bytes));
Os caracteres legíveis/de lixo mistas que você vê são devidos à mistura de várias codificações incompatíveis no mesmo fluxo. Provavelmente, o fluxo é rotulado como UTF-8, mas você está colocando caracteres codificados no CP1255 nele. Você precisa rotular o fluxo como CP1255 e colocar apenas dados codificados por CP1255 nele, ou rotulá-los como UTF-8 e colocar apenas dados codificados por UTF-8 nele. Lembre -se de que os bytes não são personagens e convertem entre eles adequadamente.
Outras dicas
Apenas para ter certeza, tente obter os valores de itempdated evento.Talvez a razão pela qual os valores não estão disponíveis é porque ainda não existem.
http://www.msn.co.il está no UTF-8 e indica isso corretamente. A sequência " xd7 x9c xd7 x94 xd7 x93 xd7 xa4 xd7 xa1 xd7 x94" também é adequada utf-8 (להדפסה). Eu não vejo o problema.
Eu acho que seu segundo problema se deve a você misturar codificações diferentes (UTF-8 e Windows-1252). Você pode querer codificar/decodificar suas cordas corretamente.
Primeiro, observe que você deve importar get
a partir de Lwp :: simples. Segundo, tudo funciona bem com:
#!/usr/bin/perl
use strict; use warnings;
use LWP::Simple qw ( getstore );
getstore 'http://www.msn.co.il', 'test.html';
o que me indica que o problema é a codificação do arquivo de arquivo para o qual você está enviando a saída.