PerlのLWPが元のWebサイトとは異なるエンコードを提供するのはなぜですか?

StackOverflow https://stackoverflow.com/questions/2341128

質問

このコードがあるとしましょう。

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';

これは、問題が出力を送信しているファイルハンドルのエンコードであることを私に示しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top