1

私は他の誰かの大規模なプロジェクトの一部を拾い上げて、間違いを正そうとしています。問題は、正しい方法がわからないということです。

だから、私はたくさんのHTMLページをカーリングし、それを次のような簡単なコマンドでファイルに書き込んでいます。

$src = `curl http://google.com`;
open FILE, ">output.html";
print FILE $src;
close FILE;

今、私はそれらをUTF-8として保存したかったのです。それは何として保存されますか?次に、同じ基本的な「open」コマンドを使用してhtmlファイルを読み取り、正規表現呼び出しでhtmlを解析し、文字列連結を使用して大きな文字列を作成し、それをXMLファイルに書き込みます(上記と同じコードを使用)。代わりにXML::Writerを使用し始めましたが、エンコードが不正確なファイルを調べて修正する必要があります。

したがって、HTMLはもうありませんが、適切な文字を表示する必要のあるXMLはまだあります。次に例を示します:http://filevo.com/wkkixmebxlmh.html

主な問題は、問題の文字を検出して、エディターに正しく表示される「\x{2019}」に置き換えることです。しかし、実際に野生のキャラクターをキャプチャするための正規表現を理解することはできません。

アップデート:

上記のFilevoにアップロードしたXMLファイルにあるALT-0146文字をまだ検出できません。UTF-8で開いて、/ \ x {2019} /、/ chr(0x2019)/を検索しましたが、/'/だけを検索しました。

4

3 に答える 3

4

HTMLドキュメントのエンコーディングを見つけるのは難しいです。http://blog.whatwg.org/the-road-to-html-5-character-encodingを参照してください。特に、「7ステップのアルゴリズムが必要です。ステップ4には2つのサブステップがあり、最初のサブステップには7つのサブステップがあります。ブランチの1つには8つのサブステップがあり、そのうちの1つは実際には7つのステップを持つ別のアルゴリズムにリンクしています...しばらくの間そのように続きます。」

これは、HTMLファイルを解析する際の限られたニーズに使用したものです。

my $CHARACTER_SET_CLASS = '\w:.()-';

     # X(HT)?ML: http://www.w3.org/International/O-charset
     /\<\?xml [^>]*(?<= )encoding=[\'\"]?([$CHARACTER_SET_CLASS]+)/ ||
     # X?HTML: http://blog.whatwg.org/the-road-to-html-5-character-encoding
     /\<meta [^>]*\bcharset=["']?([$CHARACTER_SET_CLASS]+)/i ||
     # CSS: http://www.w3.org/International/questions/qa-css-charset
     /\@charset "([^\"]*)"/ ||
于 2011-05-27T20:47:42.960 に答える
3

UTF-8で出力を生成していることを確認するには、utf8を使用してレイヤーを出力ストリームに適用します。binmode

open FILE, '>output.html';
binmode FILE, ':utf8';

または3つの引数のopen呼び出しで

open FILE, '>:utf8', 'output.html'

任意の入力は扱いにくいです。運が良ければ、HTML入力は早い段階でそのエンコーディングを教えてくれます。

wget http://www.google.com/ -O foo ; head -1 foo

<!doctype html><html><head><meta http-equiv="content-type" content="text/html; 
charset=ISO-8859-1"><title>Google</title><script>window.google=
{kEI:"xgngTYnYIoPbgQevid3cCg",kEXPI:"23933,28505,29134,29229,29658,
29695,29795,29822,29892,30111,30174,30215,30275,30562",kCSI:
{e:"23933,28505,29134,29229,29658,29695,29795,29822,29892,30111,
30174,30215,30275,30562",ei:"xgngTYnYIoPbgQevid3cCg",expi:
"23933,28505,29134,29229,29658,29695,29795,29822,29892,30111,
30174,30215,30275,30562"},authuser:0,ml:function(){},kHL:"en",
time:function(){return(new Date).getTime()},

ああ、そこにあります:。これで、入力を生のバイトとして読み取り続け、既知のエンコーディングでそれらのバイトをデコードする方法を見つけることができます。CPANはこれを支援することができます。<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">

于 2011-05-27T20:36:23.183 に答える
1
于 2011-05-28T13:40:24.530 に答える