2012-05-01 4 views
2

HTMLエンティティに特殊文字を変換しますその上、この:私はメモ帳で再びHTMLを表示すると私はHTMLファイルを持っていると私はメモ帳で表示するとき、私は以下を参照してくださいすることができます

$html = file_get_contents('test.html'); 
$html = mb_convert_encoding($html, 'HTML-ENTITIES', "UTF-8"); 
file_put_contents('output.html', $html); 

、著作権記号が消えたとスペースに置き換えられます!

著作権シンボルを©または&#169に置き換えてください。これはHTML-ENTITIESオプションのmb_convert_encodingのオプションではありませんか?

これは私が使用しているtest HTML fileです。

+0

なぜですか?本当の著作権シンボルの何が間違っていますか?読みやすく、使用するバイト数が少なくなります。 – Quentin

+0

'htmlentities($ html、ENT_COMPAT、 'UTF-8')'は何をしますか? – Jon

答えて

8

あなたのテストHTMLページはではなく、はUTF-8でエンコードされています。従って、mb_convert_encodingが著作権文字(順序値169)を見るとき、それは無効なUTF-8シーケンスとして知覚するものをどうするかを知らない。

そのためmb_convert_encodingを呼び出すときに、正しい入力エンコーディングを指定する必要があります。私は直接あなたの質問に答えるが、あなたいます:

$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'ISO-8859-1'); 

また、あなたが

$html = htmlentities($html, ENT_COMPAT | ENT_HTML401, 'ISO-8859-1'); 

ノートのようなものを使用することができますあなたが変換を必要としているとは言いません。目標を達成するためのより良い方法がある可能性があります。

+0

非常に興味深い。 'UTF-8'を前提とするのではなく、おそらく' mb_detect_encoding'を使うことができます。 – Abs

+2

@Abs:そうではありません。エンコーディングが何であるかを知っているべきです。そうでなければ、決定的な情報源(例えば、コンテンツを提供するサーバー)に問い合わせるべきです。エンコーディング "検出"は本質的にハッキーであり、常に正しく動作するとは限りません。人間と同等のものは、まったく知らない言語で誰かのテキストを見せて、それが何であるかを尋ねることです。あなたはそれが "最も北ヨーロッパの可能性が高い"と言うことができるかもしれませんが、それは十分ではありません。 – Jon

+0

私は理解しています、ジョン。しかし、ユーザーがフォームを通してtext/htmlを送信すると、エンコーディングがわからず、すべてのブラウザーがHTMLフォームのaccept-charsetをサポートするわけではありません。したがって、残っている唯一のオプションはエンコードの自動検出です – Abs

0

あなたのHTMLをUTF-8として扱っているなら、正しい処置は間違いありません。

<p><span>Copyright © 2008 Your Company Name</span> 

は完全に有効なHTMLです - ちょうどこのページのページのソースを見てください。

+0

興味深いことに、©が非UTF-8データベーステーブルから取得された場合、格納されたシンボルがUTF-8バージョンと同じに見えても、UTF-8でエンコードされたページでそれを提供することは実際には機能しません。 – Typel

+0

データベース照合、db接続、dbデータ、htmlソース、およびメタ文字セットがすべて同じエンコーディングTypelを持たないという結果を簡単に説明します。質問にはデータベースの言及はありません。 – AD7six

関連する問題