政府の 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 ("’", 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>";