1

HTML をデータベースに保存できる CMS を構築しました。それはすべて非常に単純なことから始まりました。htmlspecialchars を使用して HTML をテキストエリアに表示し、フォームが壊れないようにしました。次に、html_specialchars_decode を使用して保存しました。誰かが入力する代わりに HTML をシステムに貼り付けるまで、すべて正常に動作しているように見えました。この時点では問題なく保存されていましたが、空白のほとんどが失われていたため、すべての美しいインデントを最初から行う必要がありました。

それを修正するために、utf-8 エンコーディングですべてを指定しようとしました。

PHPヘッダーにutf-8を指定しています

header('Content-Type: text/html; charset=utf-8');

HTML ページで utf-8 を指定しています

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

HTML形式でutf-8を指定する

<form accept-charset="utf-8" 

次に、投稿された値を(基本的に)次のように読み取ります。

$Val = $_POST[$SafeFieldName];

私の理解では、PHP はすべてを utf-8 で行っていたので、この段階で gobbledegook が発生することに少し驚いています。

$Val = utf8_decode($Val);

したがって、この段階では、動作します。私は素敵なインデントをすべて失いますが、空白のすべてではありません. utf8 以外の文字が取り除かれているようです。奇妙なことに、私はChromeを使用していますが、Firefoxでは問題ないようです

私は今、自分を縛っているだけだと思います。エレガントな提案はありますか?ハッキングして機能させるのではなく、この問題の根底に到達する必要があります。

4

4 に答える 4

3

DB への接続と DB テーブル自体は UTF-8 をサポートする必要があります。テーブルの照合が utf8_general_ci であり、テーブル内のすべての文字列フィールドにも utf8_general_ci 照合があることを確認してください。

DB 接続も UTF-8 である必要があります。

mysql_set_charset('utf8');

詳細については、 http://akrabat.com/php/utf8-php-and-mysql/を参照してください。

更新:いくつかの報告

mysql_query('SET NAMES utf8');

も時々必要です!

テーブルと接続を UTF-8 で作成できない場合は、もちろん、HTML を BASE64 でエンコードされたデータとして保存し、DB から再度取得するときにデコードして戻すことができます。

于 2011-11-16T15:54:00.080 に答える
0

並べ替え - そして答えは本当に恥ずかしいです - しかし、いつか誰かがこれを必要とするかもしれません:)

Firefox では動作が異なることに気付きました (ただし、それでもかなりゴミです)。そのため、スタイル シートを調べたところ、次のことがわかりました。

white-space: nowrap;

誰か (私) が、ブラウザで水平スクロールを機能させるために、そこにそれを入れたに違いありません。それがなければ、HTML は DB に行き来します。

私の他の唯一の質問は、すべてがutf8で到着するはずだったので、なぜこれが必要なのかということでした

$Val = utf8_decode($Val);

魔法のように - 今は必要ありません。

于 2011-11-17T10:13:27.627 に答える
0

データベース接続のエンコーディングを確認し、HTML を保存するデータベース テーブル フィールドのエンコーディングを確認します。エンコーディングがUTF-8と違うのかもしれません

于 2011-11-16T15:49:43.160 に答える
0

これが MySQL 内外の問題である場合 (タイトルで提案したように)、列とテーブルが UTF8-BIN であることを確認し、mysql_set_charset('utf8');MySQL への接続を開いた後に配置する必要があります。

于 2011-11-16T15:51:50.983 に答える