2012-04-02 5 views
2

私はPerlを使用してウェブサイトを収穫しましたが、最初は何か不足していました。データのアップロードを開始すると、íなど多くの奇妙な文字が表示されます。 文字列はLíder de Projetosですが、私はLíder de Projetosです。私は一緒に50GBの周りに40のテキストファイルを持っています。Perlスクリプトを使用して収穫/掻爬するときにíを取得する

もう一度収穫せずに修正するにはどうすればよいですか?

+1

バーニーが追加"perl"タグ – ikegami

+0

それは私でした! –

+0

編集ログの内容を伝えてください。編集ログには何も削除しないbernieは表示されません。それは単に彼に "perl"タグを追加することを示しています。 – ikegami

答えて

3

あなたが見ている文字列は、このコンテキストでは一般にcharacter entity referencesと呼ばれます.HTMLエンティティ。それらは、文字をサポートしない制限された文字エンコーディングで表現する文字を使用する方法です。コンテンツを収穫したときに、「収穫機」にこれらの種類の文字で何をするかを明示していなかったので、これをアクセント付きの「i」の場所に表示しています。元のページでこれらの実体参照を使用しているか、あるいは「収穫機」がこれをあなたが望むものと想定し、その文字を実体参照に変換したのかもしれません。

これらを「修正」するには、このコンテンツで何をしたいのかを正確に決める必要があります。このデータをどのように使用するか。一度それを理解すると、少なくとも2つのオプションがあります。

  1. 何もしない:あなたがASCIIのようにセット限定された文字を使用して、あなたがそこにそれらを残して、おそらくOKだこれらの実体参照を使用する方法を知っているものに、このコンテンツを送信している場合。たとえば、これらを使用してより多くのWebページを生成している場合は、それらをそのままにして、Webページを表示するときに適切に表示する必要があります。

  2. HTML::EntitiesのようなPerlモジュールを使用してそれらをデコード:あなたがにこれらを送っている事はUnicode表現(例:UTF-8)をサポートすることができます知っているなら、あなたはここからdecode_entities()関数を使用することができますこれらの文字列をUnicode文字に変換します。これを行うと、エンティティの表現として残す必要のあるものがデコードされ、エンコードを再エンコードするか、何らかの理由でデコードされないようにする必要があるかもしれないことに注意してください。 í

2

は、16進序数値EDを持つ文字のエンティティのエスケープです。あなたはそれがその方法ではないと確信していますか?

あなたは、その文字値を持つものを置き換え、それらを復号化するためにモジュールを使用する場合:

use v5.10.1; 

binmode STDOUT, ':utf8'; 

use XML::Entities; 

my $encoded = "Líder de Projetos"; 
my $decoded = XML::Entities::decode('all', $encoded); 

say $decoded; 

今、出力は実体を持っていません。

Líder de Projetos 
0
#!/usr/bin/perl 

use strict; 
use warnings; 

$/ = undef; 
my $file = 'test.txt'; 

open FILE, "<$file" or die; 
$_ = <FILE>; 
close FILE; 

s/&#x(..);/{chr(hex($1))}/ige; 

open FILE, ">$file" or die; 
print FILE $_; 
close FILE; 
+0

'open 'の呼び出しの結果を常にチェックしてください。また、これを行うためにファイル全体をスラップする必要はありません。彼はわずか40ファイルで50GBの情報を持っていることに注意してください。そして、あなたは序数の値が2文字だけであると思いますか? –

+0

@briandfoy - 私は誰もが知っているか、死んでいると信じています。そして、1ファイルあたり1.25GBというのはそれほど悪くはありませんし、この簡単で簡単なコードはかなり速く、新しい「収穫」よりも速くなります。そして、はい、スペイン語の文章では2文字「&#x..;」しか期待していません。 –

+0

@briandfoy - ちょうど1.25 GBのHTMLファイルをテストしたところ、0.3878秒しかかかりませんでした。仮想サーバーで –

関連する問題