PerlのLWPが元のWebサイトとは異なるエンコードを提供するのはなぜですか?
-
22-09-2019 - |
質問
このコードがあるとしましょう。
use strict;
use LWP qw ( get );
my $content = get ( "http://www.msn.co.il" );
print STDERR $content;
エラーログは、「 xd7 x9c xd7 x94 xd7 x93 xd7 xa4 xd7 xa1 xd7 x94 "のようなものを示しています。
ウェブサイトのエンコードはあります
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1255">
では、なぜこれらのキャラクターがWindows-1255のcharではなく現れるのでしょうか?
そして、もう1つの奇妙なことは、2つのサーバーがあることです。
CP1255 CHARを返す最初のサーバーと私は単にUTF8に変換することができます。
エンコードを台無しにしているApache/Perl/モジュールに構成ファイルはありますか?何かを強制する...?
2番目のサーバーの私のウェブサイトでの結果は、PerlファイルとヘッダーがすべてUTF8であるため、英語のcharではないテキストを書くと、上記の例のコンテンツがOKを表示しています(奇妙なUTF Charsであっても)しかし、私自身の静的テキストは「×ס '×רx:」のように見えます。
私がテストしたもう一つのことは...
Perlを通じて:
my $content = `curl "http://www.anglo-saxon.co.il"`;
UTF8エンコードを取得します。
バッシュを通して:
curl "http://www.anglo-saxon.co.il"
そして、ここで私はCP1255(Windows-1255)をエンコードします...
また、スクリプトをbashで実行すると、CP1255が与えられ、Webを通して実行すると、再びUTF8です...
UTF8からコンテンツを変更することで問題を修正しました - 想定されるものまで、そして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);
解決
あなたが与えた六角値を持つ文字列は、UTF-8エンコーディングのように見えます。 Perlが文字列を扱うときにUTF-8を使用するのが好きなので、これを手に入れています。 LWP::Simple->get()
メソッドは、コンテンツエンコードを元に戻し、UTF-8に変換することを含むサーバーからコンテンツを自動的に解読します。
内部を掘り下げて、キャラクターエンコーディングを変更するバージョンを取得できます(参照 http :: message's decoded_content, 、によって使用されます http :: responseのdecoded_content, 、あなたがから得ることができます LWP :: useragent's get)。しかし、希望するエンコードのデータを次のようなもので再エンコードする方が簡単かもしれません
use Encode;
...;
$cp1255_bytes = encode('CP1255', decode('UTF_8', $utf8_bytes));
読みやすい/ごみの混合キャラクターは、同じストリームで複数の互換性のないエンコーディングを混合したことによるものです。おそらく、ストリームはUTF-8とラベル付けされていますが、CP1255エンコードされた文字を入れています。ストリームをCP1255としてラベル付けし、CP1255エンコードデータのみを使用するか、UTF-8としてラベル付けし、UTF-8エンコードデータのみを配置する必要があります。バイトは文字ではなく、それらの間を適切に変換することを思い出してください。
他のヒント
ただ確かに、 itemupdated イベントから値を取得してみてください。値が利用できない理由は、まだ存在しないためです。
http://www.msn.co.il UTF-8であり、それを適切に示しています。文字列 " xd7 x9c xd7 x94 xd7 x93 xd7 xa4 xd7 xa1 xd7 x94"も適切なUTF-8(לללדפסンター)です。問題はありません。
あなたの2番目の問題は、さまざまなエンコーディング(UTF-8とWindows-1252)を混合したことによるものだと思います。あなたはしたいかもしれない エンコード/デコード あなたの文字列は適切に。
まず、インポートする必要があることに注意してください get
から LWP ::シンプル. 。第二に、すべてが正常に機能します:
#!/usr/bin/perl
use strict; use warnings;
use LWP::Simple qw ( getstore );
getstore 'http://www.msn.co.il', 'test.html';
これは、問題が出力を送信しているファイルハンドルのエンコードであることを私に示しています。