0

Perl で Web ページのコンテンツ (式) をダウンロードしようとしています。「LWP::UserAgent」モジュールを使用してコンテンツを解析し、UTF8 形式をチェックするように注意しました。コードは次のとおりです。

use LWP::UserAgent;
my $ua = new LWP::UserAgent;
my $response = $ua->get('http://www.abc.org/patent/formulae');

my $content =$response->decoded_content();

if (utf8::is_utf8($content))
{
    binmode STDOUT,':utf8';
}
else
{
    binmode STDOUT,':raw';
}

print $content;

しかし、私はまだワイド文字を取得しています & 出力は次のとおりです:

#10; "

私が欲しいのに対し:

"Fromula = Ï Ì â¡ ( c + / c 0 ) â 1 "

どうすればそれを避けることができますか?

4

1 に答える 1

3

decoded_content、HTTP ヘッダーで使用可能なエンコードと文字セットの情報を使用して、データをデコードします。ただし、HTML ファイルでは別のエンコーディングが指定されている場合があります。

出力ファイルを utf8 にしたい場合は、常に:utf8レイヤーを適用する必要があります。あなたがやろうとしていることis_uft8間違っています。

Perl 文字列は、2 つの異なるエンコーディングで内部的に保存されます。これは、プログラマーであるあなたにはまったく関係ありません。は、このis_utf8内部表現を決定する内部フラグの値を読み取るだけです。このフラグが設定されていないからといって、文字列内の 1 つのコードポイントが としてエンコードされたときに複数のバイトとしてエンコードされない可能性があるという意味ではありませんutf8

サーバーから取得したデータには、さまざまなレベルのエンコーディングがあります

  • 圧縮などのエンコーディング
  • 文字セット
  • HTML で指定された文字セット
  • のような HTML エンティティ&quot

が最初の 2 つのdecoded_contentレベルを処理し、残りはあなたに任せます。エンティティを削除するには、HTML::Entitiesモジュールを使用できます。当たり前。

use open qw/:std :utf8/;  # Apply :utf8 layer to STD{IN,OUT,ERR}

...;

if ($response->is_success) {
  my $content = $response->decoded_content;
  print decode_entities $content;
}

これが機能することを確認できないことに注意してください。404 を指定した URL (いらいらすることに、404 ステータス コードを送信せずに)。

于 2013-07-25T06:35:13.400 に答える