latin1 から utf8 に変更しました。あらゆる種類のテキストが正常に表示されていましたが、英語以外の文字が奇妙な記号としてデータベースに保存されていることに気付きました。私はそれを修正するために1日を費やしましたが、最終的には英語以外の文字がデータベースで英語以外の文字として表示され、ブラウザでも同じように表示されます. '
ただし、アポストロフィが として保存され、感嘆符がとして保存されていることに気付きました!
。これは正常ですか、それとも ' および ! 代わりにデータベースに?もしそうなら、それを修正するために何をする必要がありますか?
2 に答える
&#XX;
フォームはHTML 文字エンティティであり、データベースに保存されている値を PHPhtmlspecialchars
やhtmlentities
. 値が HTML ドキュメント内で処理される場合 (または、その一部であるかに関係なく、おそらく任意の HTML プロセッサによって処理される場合) は、正常に表示されるはずです。それ以外では、彼らはそうしません。
これはおそらく、それらを HTML エンティティとしてエンコードしたままにしたくないことを意味します。値をエンコードするために使用した関数 (例: ) に対応するものを使用して、値を元に戻すことができます。この関数は、変換先のhtml_entity_decode
エンコードに関する引数を取る必要があります。それが完了したら、以前に問題があったエントリのいくつかをチェックし、それらを表示するために正しいエンコーディングを使用していることを確認してください。
それでも問題が解決しない場合は、格納された値が使用するはずのエンコーディングと、実際に使用されているエンコーディングが一致していません。彼らが実際に使用しているものを把握し、DBからそれらを引き出して変換し、それらを再挿入する前にターゲットエンコーディングに変換するか、実際に使用するエンコーディングで再挿入する必要があります. 後者のオプションと同様に、列をBLOB
s に変換し、次に列の文字セットを変更し、次に列の型をテキスト型に戻してから、列を目的の文字エンコーディングに直接変換します。この扱いにくいシーケンスの理由は、文字エンコーディングを変更するとテキスト型は変換されますが、バイナリ型は変換されないためです。
一般的な文字エンコーディングの詳細については、 「すべてのソフトウェア開発者が絶対に、積極的に Unicode と文字セットについて知っておくべき絶対最小値 (言い訳はありません!) 」をお読みください。また、 § 9.1.4. MySQLでエンコーディングがどのように使用されるかについては、MySQL マニュアルの「Connection Character Sets and Collations」を参照してください。
それは、データベースの内容をどうしようとしているかによって異なります。不変条件が「データベースのコンテンツはサニタイズされており、それ以上の検証/サニタイズなしで Web ページに直接配置される可能性がある」ということである場合、& およびデータベース内の他の html エンティティは完全に理にかなっています。一方、データベースが生の元のデータのみを保存し、それを処理/サニタイズしてから HTML コードで表示する場合は、これらのエンティティを UTF でエンコードされた元の文字に置き換える必要があります。 -8. したがって、データベースの内容をどのように解釈するかによって異なります。