Pregunta

Digamos que tengo este código:

use strict;
use LWP qw ( get );

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

print STDERR $content;

El error de registro muestra algo así como "\ xd7 \ x9c \ xd7 \ x94 \ xd7 \ x93 \ xd7 \ xa4 \ xd7 \ xa1 \ xd7 \ x94" lo que supongo que de UTF-16?

codificación de la página web es con

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

¿por qué estos personajes aparecen y no los caracteres windows-1255?

Y, otra cosa extraña es que tengo dos servidores:

el primer servidor de regresar CP1255 caracteres y puedo simplemente convertirlo en UTF-8, y el servidor actual me da estos caracteres y no puedo hacer nada con ella ...

¿hay algún archivo de configuración en Apache / Perl / módulo que está arruinando la codificación? obligando a algo ...?

El resultado en mi sitio web en el segundo servidor, es que el archivo perl y las cabeceras son UTF-8, por lo que cuando escribo texto que no son caracteres ingleses, el contenido del ejemplo anterior está mostrando bien (aunque es caracteres UTF extraños), pero mi propio texto estático son mirada como "×× ¡ '××× ¨ ××:"

Una cosa más que he probado es ...

A través de Perl:

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

consigo la codificación UTF-8.

A través de Bash:

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

y aquí me sale CP1255 (Windows-1255) que codifica ...

Además, cuando ejecuto el script en bash - da CP1255, y cuando se ejecuta a través de la web - entonces es utf8 de nuevo ...

solucionado el problema por cambiar Mas el contenido de UTF8 - a lo que se supone y, a continuación, volver a UTF-8:

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

Solución

Aparece la cadena con los valores hexadecimales que diste a ser una codificación UTF-8. Que está recibiendo esto porque Perl ‘le gusta’ el uso de UTF-8 cuando se trata de cadenas. El método LWP::Simple->get() decodifica automáticamente el contenido desde el servidor que incluye deshacer cualquier Contenido-Encoding, así como la conversión a UTF-8.

Se podría profundizar en los elementos internos y obtener una versión que hace cambiar la codificación de caracteres (ver HTTP :: decoded_content del mensaje, que es utilizado por HTTP de la respuesta :: decoded_content , que se puede obtener de LWP :: get agente de usuario de ). Pero puede ser más fácil de volver a codificar los datos en su codificación deseado con algo como

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

Los caracteres / basura legibles mixtos que se ven son debido a la mezcla múltiple, codificaciones incompatibles en la misma corriente. Es probable que la corriente está etiquetado como UTF-8, pero que lo coloca CP1255 codificado caracteres en ella. Usted ya sea necesidad de etiquetar la corriente como CP1255 y poner los datos sólo CP1255-codificados en ella, o etiquetarlo como UTF-8 y poner los datos codificados en UTF-8 sólo en ella. Recuérdese que los bytes no son caracteres y convertir entre ellos adecuadamente.

Otros consejos

Todo esto codificación manual y la decodificación es innecesario. El código HTML está mintiendo cuando dice que la página está codificado en windows-1255; el servidor dice que está sirviendo UTF-8, y lo es. La culpa herramientas HTML generación de Microsoft.

De todos modos, ya que el servidor hace devolver la codificación correcta, funciona esto:

my $response = LWP::UserAgent->new->get("http://www.msn.co.il/");
my $content = $res->decoded_content;

$content ahora es una cadena de caracteres Perl, listo para hacer lo que sea necesario. Si desea convertirlo a alguna otra codificación, a continuación, llamar Encode::encode en que sea necesario; hacer no Encode::decode utilización como ya se ha decodificado una vez.

http://www.msn.co.il es en UTF-8, e indica que adecuadamente. La cadena "\ xd7 \ x9c \ xd7 \ x94 \ xd7 \ x93 \ xd7 \ xa4 \ xd7 \ xa1 \ xd7 \ x94" también es adecuado UTF-8 (להדפסה). No veo el problema.

Creo que el segundo problema se debe a que la mezcla de diferentes codificaciones (UTF-8 y Windows-1252). Es posible que desee de codificación / decodificación sus cuerdas correctamente.

En primer lugar, tenga en cuenta que debe importar get de LWP :: Simple . En segundo lugar, todo funciona bien con:

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

lo que me indica que el problema es la codificación del gestor de archivo al que está enviando la salida.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top