Domanda

Diciamo che ho questo codice:

use strict;
use LWP qw ( get );

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

print STDERR $content;

Il log di errore mostra qualcosa come "\ XD7 \ x9c \ XD7 \ x94 \ XD7 \ x93 \ XD7 \ xa4 \ XD7 \ xa1 \ XD7 \ x94" che sto indovinando che è UTF-16?

Codifica del sito web è con

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

quindi perché questi personaggi appaiono e non le finestre-1255 caratteri?

E, un'altra cosa strana è che ho due server:

il primo server di ritorno caratteri CP1255 e posso semplicemente convertirlo in utf8, e il server corrente mi dà questi caratteri e non posso fare nulla con esso ...

non v'è alcun file di configurazione in / perl / modulo di Apache che è in disordine la codifica? costringendo qualcosa ...?

Il risultato nel mio sito al secondo server, è che il file Perl e le intestazioni sono tutti utf8, così quando scrivo il testo che non sono l'inglese caratteri, il contenuto dall'esempio precedente sta mostrando ok (anche se è strani caratteri UTF), ma il mio testo statico si assomigliano "×× ¡ '××× ¨ ××:"

Una cosa che ho provato è ...

Attraverso perl:

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

ottengo codifica utf8.

Con Bash:

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

e qui ottengo CP1255 (Windows-1255) codifica ...

Inoltre, quando ho eseguito lo script in bash - dà CP1255, e quando eseguirlo attraverso il web - allora è di nuovo utf8 ...

risolto il problema changin il contenuto da utf8 - a quello che dovrebbe, e poi di nuovo a 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);
È stato utile?

Soluzione

La stringa con i valori esadecimali che ti ha dato sembra essere una codifica UTF-8. Hai trovato questo perché Perl ‘piace’ utilizzare UTF-8 quando si tratta con le stringhe. Il metodo LWP::Simple->get() decodifica automaticamente il contenuto dal server che comprende disfare qualsiasi Content-Encoding, nonché la conversione in UTF-8.

Si potrebbe scavare l'interno e ottenere una versione che fa cambiare la codifica dei caratteri (vedi HTTP :: decoded_content del messaggio, che viene utilizzato da HTTP :: decoded_content di risposta , che si può ottenere da LWP :: UserAgent Otteniamo ). Ma può essere più facile da ri-codificare i dati nel vostro codifica desiderata con qualcosa del tipo

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

I / caratteri illeggibili leggibili misti che vedete sono dovuti a mescolare molteplici, codifiche incompatibili nello stesso flusso. Probabilmente il flusso è etichettato come UTF-8, ma si sta mettendo caratteri CP1255 codificati in esso. Si sia necessario etichettare il flusso come CP1255 e mettere solo i dati CP1255-codificati in esso, o etichettarlo come UTF-8 e mettere solo i dati UTF-8-codificati in esso. Pensi che i byte non sono caratteri e la conversione tra di loro in modo appropriato.

Altri suggerimenti

Tutto questo manuale codifica e decodifica è inutile. Il codice HTML sta mentendo quando dice che la pagina è codificato in Windows-1255; il server dice che è al servizio UTF-8, e lo è. Colpa strumenti HTML generazione di Microsoft.

In ogni caso, dato che il server non tornare la codifica corretta, questo funziona:

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

$content è ora una stringa di caratteri perl, pronto a fare ciò che è necessario. Se si desidera convertire a qualche altra codifica, quindi chiamando Encode::encode su di esso è appropriato; fare non uso Encode::decode come è già stato decodificato una volta.

http://www.msn.co.il è in UTF-8, e indica che correttamente. La stringa "\ XD7 \ x9c \ XD7 \ x94 \ XD7 \ x93 \ XD7 \ xa4 \ XD7 \ xa1 \ XD7 \ x94" è anche una corretta UTF-8 (להדפסה). Non vedo il problema.

Credo che il tuo secondo problema è dovuto a voi mescolando diverse codifiche (UTF-8 e Windows-1252). Si potrebbe desiderare di codifica / decodifica le corde in modo corretto.

In primo luogo, si noti che è necessario importare get da LWP :: Simple . In secondo luogo, tutto funziona bene con:

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

che indica a me che il problema è la codifica del filehandle a cui si sta inviando l'output.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top