0

政府の Web サイトから HTML ファイル (!DOCTYPE を含まない生の HTML...) をダウンロードし、段落を抽出して MySQL データベースに入れています。

私はDOMDocumentを使用しているので、行きます

$doc = DOMDocument();
$doc->loadHTMLFile( "../notifs/notif$notif_no.htm" );

問題は、特定の文字が奇妙なものに変換されるために発生します。たとえば、(1 つのタイプの) アポストロフィが ¢€™ になります。

次に、このパラをテーブルのテキスト フィールドに保存しようとすると、MySQL によって拒否されるか、テキスト フィールドのエンコーディングに応じて、これらの奇妙な文字として記録されます。

また、 $doc->saveHTMLFile( "test.htm" ); に行くと、実際には、アポストロフィではなく、奇妙な文字が出力されます。

これはエンコーディングと関係があることは知っていますが、数日間グーグルで検索し、SEに関する質問をよく調べても解決には至りませんでした。Firefox は、ダウンロードした HTML ファイルが utf-8 エンコーディングであると教えてくれます。default_charset が「utf-8」になるように php.ini ファイルを変更してみました。喜びはありません。

私はウェブサイト担当者というよりはアプリケーション プログラマーなので、エンコーディングに関してはまったくの初心者です。私はこれを自分でクラックしようとしましたが、何が起こっているのか、何をすべきかを本当に理解していません.

後で

置くことによってそれを発見しました

$file = file_get_contents("../notifs/notif$notif_no.htm");
$doc->loadHTML('<?xml encoding="UTF-8">' . $file );

その後、 saveHTMLFile() は正しいアポストロフィで出力します... SQL INSERT INTO ... (...) VALUES (...) 文字列の私のエコーと同様です。しかし、MySQL テキスト フィールドのテキストは頑固に協力を拒否しています。(当然、複数の異なる照合を試しました)。一方、mb_detect_encoding ( $clean_string ) は "UTF-8" を出力し、mb_check_encoding ( $clean_string ) は TRUE を返します。

ただし、別の不可解なこと:もしそうなら

$doc->loadHTML('<?xml encoding="latin1">' . $file )

この同じ部分的な成功は、「UTF-8」が検出されたエンコーディングに至るまで、同じままです。うーん

後で

$doc = new DOMDocument();
$file = file_get_contents("../notifs/notif$notif_no.htm");
# without this following line adding an explicit encoding for the DOMDocument nothing worked!
$doc->loadHTML('<?xml encoding="UTF-8">' . $file );

そして、いくつかのテキストを抽出して少しクリーンアップしたら、それを $clean_string と呼びます

# convert difficult UTF-8 characters into HTML special sequences ("&rsquo;", etc.) 
$clean_string = mb_convert_encoding($clean_string, "HTML-ENTITIES", "UTF-8"); 

この $clean_string の後に、「...ワインは飲む価値がある」のようなシーケンスが含まれます...しかし、私は、まだかなり混乱する可能性があります。

echo ">>> clean string $clean_string<br>";

...「’」もちろん、シーケンスはブラウザによって ' (一重引用符) として表示されます。

これはおそらくほとんどの PHPers にとって絶対に明らかなことです...しかし、 $clean_string にあるものの正確な画像を表示したい場合は、行かなければなりません

$decoded_clean_string = htmlspecialchars( $clean_string, ENT_QUOTES );
echo ">>> decoded string: $decoded_clean_string<br>";
4

1 に答える 1

1
$doc = DOMDocument();
$file = file_get_contents("../notifs/notif$notif_no.htm");
$file = mb_convert_encoding($file, "UTF-8");
$doc->loadHTML( $file );

試してみる価値?

また

$file = mb_convert_encoding($file, 'HTML-ENTITIES', 'UTF-8');
于 2012-11-14T19:28:58.130 に答える