2017-03-11 7 views
0

私はHTMファイルを持っています。私はメモ帳で直接それを開くと、それは次のようになります。HTMファイルを読む:すべての文字の周りの不思議な空白

<HTML> 
<BODY BGCOLOR=#FFFFFF BGPROPERTIES=FIXED> 
<FONT 000000 FACE=ARIAL SIZE=3> 
<HEAD> 

私はPerlでこれを実行しようとすると:

Perlの配列の各行には、今、これらの余分なスペースがあり、のように見える

open (my $fh, '<', $filename) or die "Error opening file! $!"; 
chomp(my @lines = <$fh>); 
close $fh; 
これは:

< H T M L >  
< B O D Y B G C O L O R = # F F F F F F B G P R O P E R T I E S = F I X E D >  
< F O N T 0 0 0 0 0 0 F A C E = A R I A L S I Z E = 3 >  
< H E A D > 

問題のどこに問題がありますか?

CLARIFICATION:これらは私のHTMファイルではないので、私はそれらを制御することも、作成することもできません。ファイルを受け取り、内容を処理する必要があります。 s/ (?= |\w)//gのようなさまざまな攻撃は、この神秘的な空白には影響しないようです。

出力はこのように生成されている:

foreach (@lines) { 
    $line .= "$_\n"; 
} 

open($fh, '>', 'output-file.txt') or die "Could not open file $!"; 
print $fh $line; 
close $fh; 
+0

あなたのエディタがスペースや改行などをどのように扱うかを確認します。また、すべての環境で使用するエンコーディングをチェックするか、少なくともこの情報を投稿してください。 – curveball

+2

どのように間隔をおいて出力していますか? – George

+1

ファイルのエンコーディングとは何ですか?それがUTF-16としてエンコードされていないことを確認してください。そうであれば、読み込み時に正しくデコードしてください。また、実際にデータを印刷する方法と、引用したコードと印刷時に発生する関連するものについて、どのように表示したかがわかりました。また、スクリプトの出力をhexdumpで実行して、実際にそれらのスペースが何かを確認してください。 – jcaron

答えて

-1

私は明らかに漢字の中に多くのNULLを変換s/\x0//gを適用しました。私はs/[^[:ascii:]]+//g;でこれらを掃除しました。理想的ではないが、うまくいくようだ。

0

テキストはありませんが、エンコードされたテキストです。すべてのファイルは1つの特定の文字エンコーディングで記​​述され、同じエンコーディングで読み取られなければなりません。

HTMLファイルは書式設定されたテキストです。それらには、ファイルが書き込まれたエンコーディングがあります。文書「値」は、Unicode文字のシーケンスです。ファイルがUnicodeエンコーディングを使用しない場合、文字は数値エンティティとして表すことができます(たとえば、&#x1f6b2;の代わりに)。彼らはまた、内部的に文書のエンコーディング(meta charset)を示すためのメカニズムを持っていますが、明らかにそれは使われていませんでした。

テキストファイルを受け取ったときには、それを書き込むためにどのエンコーディングが使用されているかも把握している必要があります。あなたがそれを持っていなければ、それは失敗したコミュニケーションです。 (Webサーバとブラウザは、HTTP Content-Typeという見出しでどのエンコーディングが使用されているかを互いに伝え合うことでそれを防ぎます。残念なことに、単一のシステムのファイルシステムにファイルをドロップするプログラムでは、デフォルトまたは "検出"あなたのテキストレンダラーがUTF-16でエンコードされたテキストに対処しているように見えますが、ゼロバイトが表示されるスペースを空けているようです。 (私はそれがどのように対処するのだろうかと思います。)人々は推測を改善できるように、あなたのバイトの16進数ダンプを求めています。それがUTF-16と矛盾していれば、そのような小さなサンプルであっても、それは非常に起こりそうな推測になります。

解決方法は簡単です。エンコードがUTF-16であることを送信者に確認し、バイトオーダーに応じてUTF-16LEまたはUTF-16BEとして読み取ります。エンコーディングがUTF-16であるという知識があれば、バイトオーダリングは簡単に検出できます。したがって、ファイルをバイトストリングとしてスラップし、Encode::Unicodeを使用してバイトをテキストストリングにデコードします。

関連する問題