Question

Disons que j'ai ce code:

use strict;
use LWP qw ( get );

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

print STDERR $content;

Le journal des erreurs montre quelque chose comme "\ XD7 \ x9c \ XD7 \ x94 \ XD7 \ x93 \ XD7 \ XA4 \ XD7 \ xa1 \ XD7 \ x94" que je devine que c'est utf-16?

Le codage du site est avec

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

alors pourquoi ces personnages apparaissent et non les fenêtres-1255 caractères?

Et, une autre chose étrange est que j'ai deux serveurs:

le premier serveur retour carbonise CP1255 et je peux simplement le convertir en UTF8, et le serveur actuel me donne ces caractères et je ne peux rien faire avec ...

est-il un fichier de configuration dans apache / perl / module qui salit l'encodage? forçant quelque chose ...?

Le résultat de mon site au deuxième serveur, est que le fichier perl et les en-têtes sont UTF8, donc quand j'écrire du texte qui ne sont pas les caractères anglais, le contenu de l'exemple ci-dessus montrent ok (même si elle est étranges caractères UTF), mais mon propre texte statique sont ressemblent "×× ¡ '××× ¨ ××:"

Une autre chose que je tester est ...

Par perl:

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

Je reçois l'encodage UTF8.

Par Bash:

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

et ici je reçois CP1255 (Windows 1255) encodage ...

En outre, quand je lance le script en bash - il donne CP1255, et quand l'exécuter à travers le web - il est à nouveau UTF8 ...

résolu le problème par Changin le contenu de UTF8 - à ce qui est censé, puis revenir à 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);
Était-ce utile?

La solution

La chaîne avec les valeurs hexagonales que vous avez données semble être un codage UTF-8. Vous obtenez cela parce que Perl « aime » utiliser UTF-8 quand il traite des cordes. La méthode de LWP::Simple->get() décode automatiquement le contenu à partir du serveur, qui comprend tout défaisant Content-Encoding ainsi que la conversion en UTF-8.

Vous pouvez creuser dans les entrailles et obtenir une version qui fait changer le codage des caractères (voir HTTP :: decoded_content message , qui est utilisé par HTTP :: le decoded_content de réponse , que vous pouvez obtenir de LWP :: UserAgent de get). Mais il peut être plus facile de ré-encoder les données dans l'encodage désiré avec quelque chose comme

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

Les caractères lisibles / déchets mixtes que vous voyez sont dus à un mélange de multiples encodages incompatibles dans le même flux. Probablement le flux est étiqueté comme UTF-8, mais vous mettez des caractères codés CP1255 en elle. Vous avez besoin soit d'étiqueter le flux comme CP1255 et mettre uniquement les données codées CP1255-en, ou l'étiqueter comme UTF-8 et de mettre les données codées uniquement UTF-8 en elle. Rappelez-vous que les octets ne sont pas des caractères et convertir entre eux de façon appropriée.

Autres conseils

Tous ce codage manuel et le décodage est inutile. Le code HTML est de vous mentir quand il dit que la page est codée dans les fenêtres-1255; le serveur dit qu'il est au service de l'UTF-8, et il est. Blame outils Microsoft HTML génération.

Quoi qu'il en soit, depuis le serveur ne retourner le codage correct, cela fonctionne:

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

$content est maintenant une chaîne de caractères perl, prêt à faire tout ce dont vous avez besoin. Si vous voulez le convertir en un autre encodage, puis en appelant Encode::encode sur il convient; faire pas utiliser Encode::decode comme il a déjà été décodé une fois.

http://www.msn.co.il est en UTF-8, et indique que correctement. La chaîne "\ XD7 \ x9c \ XD7 \ x94 \ XD7 \ x93 \ XD7 \ XA4 \ XD7 \ xa1 \ XD7 \ x94" est également bon UTF-8 (להדפסה). Je ne vois pas le problème.

Je pense que votre deuxième problème est dû à vous mélanger différents encodages (UTF-8 et Windows 1252). Vous pouvez encode / decode vos chaînes correctement.

Tout d'abord, notez que vous devez importer get de LWP :: Simple . En second lieu, tout fonctionne très bien avec:

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

qui me indique que le problème est le codage du descripteur de fichier auquel vous envoyez la sortie.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top