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);
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top