Frage

Nehmen wir an, ich habe diesen Code:

use strict;
use LWP qw ( get );

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

print STDERR $content;

Das Fehlerprotokoll zeigt so etwas wie " xd7 x9c xd7 x94 xd7 x93 xd7 xa4 xd7 xa1 xd7 x94", was ich vermute, es ist utf-16?

Die Codierung der Website ist mit

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

Warum erscheinen diese Charaktere und nicht die Windows-1255-Zeichen?

Und eine andere seltsame Sache ist, dass ich zwei Server habe:

Der erste Server, der CP1255 -Zeichen zurückgibt, und ich kann ihn einfach in UTF8 konvertieren, und der aktuelle Server gibt mir diese Zeichen und ich kann nichts damit machen ...

Gibt es eine Konfigurationsdatei in Apache/Perl/Modul, die die Codierung durcheinander bringt? etwas zwingen ...?

Das Ergebnis meiner Website auf dem zweiten Server ist, dass die Perl -Datei und die Header alle UTF8 sind. Wenn ich also Text schreibe, die keine englischen Zeichen sind, wird der Inhalt des obigen Beispiels OK angezeigt (obwohl es seltsame UTF -Zeichen ist ) Aber mein eigener statischer Text sehen aus wie "× × ¡'× x × × ×:"

Eine weitere Sache, die ich getestet habe, ist ...

Durch Perl:

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

Ich bekomme UTF8 -Codierung.

Durch Bash:

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

Und hier bekomme ich CP1255 (Windows-1255) -Codierung ...

Auch wenn ich das Skript in Bash ausführe - gibt es CP1255, und wenn ich es durch das Web ausführe, dann ist es wieder utf8 ...

Das Problem wurde behoben, indem der Inhalt von UTF8 wechselte - zu dem, was zu sein soll, und dann zurück zu 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);
War es hilfreich?

Lösung

Die Zeichenfolge mit den Hex-Werten, die Sie angegeben haben, scheint eine UTF-8-Codierung zu sein. Sie bekommen dies, weil Perl utf-8 verwendet, wenn es sich um Saiten handelt. Das LWP::Simple->get() Die Methode dekodiert automatisch den Inhalt des Servers, der alle Inhaltscodierung sowie das Konvertieren in UTF-8 enthält.

Sie können sich in die Interna eintauchen und eine Version erhalten, die die Charaktercodierung ändert (siehe Http :: meldung decoded_content, was verwendet wird von Http :: reaktions decoded_content, von dem Sie bekommen können LWP :: UserAgent's Get). Es kann jedoch einfacher sein, die Daten in Ihrer gewünschten Codierung mit so etwas wie so neu zucodieren

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

Die gemischten lesbaren/Müllzeichen, die Sie sehen, sind auf das Mischen mehrerer, inkompatibler Codierungen im selben Strom zurückzuführen. Wahrscheinlich ist der Stream als UTF-8 bezeichnet, aber Sie geben CP1255-codierte Zeichen in ihn ein. Entweder müssen Sie den Stream als CP1255 kennzeichnen und nur CP1255-kodierte Daten einfügen oder sie als UTF-8 kennzeichnen und nur UTF-8-kodierte Daten einfügen. Erinnern Sie sich daran, dass Bytes keine Charaktere sind und sich entsprechend zwischen ihnen konvertieren.

Andere Tipps

Um nur sicher zu sein, versuchen Sie, die Werte von itendatedated Event zu erhalten.Vielleicht ist der Grund, warum die Werte nicht verfügbar sind, weil sie noch nicht existieren.

http://www.msn.co.il ist in UTF-8 und zeigt dies richtig an. Die Zeichenfolge " xd7 x9c xd7 x94 xd7 x93 xd7 xa4 xd7 xa1 xd7 x94" ist auch utf-8 (להדפסה). Ich sehe das Problem nicht.

Ich denke, Ihr zweites Problem ist darauf zurückzuführen, dass Sie verschiedene Codierungen mischen (UTF-8 und Windows-1252). Sie möchten vielleicht verschlüsseln entschlüsseln Ihre Saiten richtig.

Beachten Sie zunächst, dass Sie importieren sollten get aus LWP :: Einfach. Zweitens funktioniert alles gut mit:

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

Dies zeigt mir, dass das Problem die Codierung des DateiHandle ist, an den Sie die Ausgabe senden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top