3

私はこのコードを持っているとしましょう:

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」のようなものが表示されますが、これは utf-16 だと思いますか?

ウェブサイトのエンコーディングは

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

では、なぜこれらの文字が表示され、windows-1255 の文字は表示されないのでしょうか?

そして、もう1つの奇妙なことは、2つのサーバーがあることです:

CP1255文字を返す最初のサーバーと私は単にそれをutf8に変換することができ、現在のサーバーは私にこれらの文字を与え、私はそれで何もできません...

エンコーディングを台無しにしている設定ファイルが apache/perl/module にありますか? 何かを強制する...?

2番目のサーバーにある私のWebサイトの結果は、perlファイルとヘッダーがすべてutf8であるため、英語の文字ではないテキストを書くと、上記の例のコンテンツは正常に表示されます(奇妙なutf文字ですが)しかし、私自身の静的テキストは「×ס'××ר××:」のように見えます

私がテストしたもう1つのことは...

perl 経由:

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

utf8エンコーディングを取得します。

Bash 経由:

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);
4

4 に答える 4

8

この手動によるエンコードとデコードはすべて不要です。ページがwindows-1255でエンコードされていると表示されている場合、HTMLはあなたに嘘をついています。サーバーはUTF-8を提供していると言っていますが、そうです。MicrosoftHTML生成ツールのせいにします。

とにかく、サーバー正しいエンコーディングを返すので、これは機能します:

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

$contentこれでperl文字列になり、必要なことを何でも実行できるようになりました。それを他のエンコーディングに変換したい場合は、それを呼び出すのEncode::encodeが適切です。すでに一度デコードされているので使用しないでください。Encode::decode

于 2010-02-26T18:11:53.967 に答える
5

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) が混在しているためだと思います。文字列を適切にエンコード/デコードしたい場合があります。

于 2010-02-26T11:36:02.217 に答える
3

まず、 LWP::Simplegetからインポートする必要があることに注意してください。第二に、すべてが正常に動作します:

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

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

于 2010-02-26T12:47:56.773 に答える
2

指定した16進値の文字列は、UTF-8エンコーディングのようです。Perlは文字列を処理するときにUTF-8を使用するのが好きなので、これを取得しています。このLWP::Simple->get()メソッドは、サーバーからコンテンツを自動的にデコードします。これには、Content-Encodingの取り消しや、UTF-8への変換が含まれます。

内部を掘り下げて、文字エンコードを変更するバージョンを取得できます(HTTP::Responseのdecode_contentで使用されるHTTP ::Messageのdecode_contentを参照してください。これは、 LWP :: UserAgentのgetから取得できます)。ただし、次のようなコードを使用して、データを目的のエンコーディングで再エンコードする方が簡単な場合があります。

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

表示される読み取り可能/ガベージ文字が混在しているのは、同じストリームに互換性のない複数のエンコーディングが混在しているためです。おそらくストリームはUTF-8としてラベル付けされていますが、CP1255でエンコードされた文字をストリームに入れています。ストリームにCP1255のラベルを付けて、CP1255でエンコードされたデータのみを入れるか、UTF-8のラベルを付けて、UTF-8でエンコードされたデータのみを入れる必要があります。バイトは文字ではないことを思い出して、それらの間で適切に変換してください。

于 2010-02-26T11:54:00.970 に答える