2010-11-23 11 views
0

私はユーザーがMySQLデータベースにコンテンツをアップロードするシンプルなアプリケーションを作っていますが、一部のエンティティはエンコードされていません。このようなことが表示されますフィールドにââÅÅを保存するMySQL

引用符の代わりに何かが表示されます。私は、データベースに挿入されているときにこれらの値をHTMLエンティティにエンコードしたはずですが、データを含む数千の行が存在することがわかりました。

データがブラウザに返されたときにこれらの値をエンコードするPHP関数がありますか?


アレックス・ブラウン更新。エンコードはここに問題があるかもしれないので、あまりにも、ここで私が見たものです。

alt text

+1

あなたのデータベースで、接続と出力のためにどんな文字エンコードを使用していますか? – Gumbo

+0

これはこれですか?DEFAULT CHARSET = latin1; – dotty

+0

使用しているロケール/キャラクタセットがわからなくても、それを元に戻すことはできません – stillstanding

答えて

4

ユーザーのブラウザがUTF-8でエンコードされたデータを提出しているが、あなたは1)あなたを想定しているデータベースに接続されていますlatin1でエンコードされたデータを送信しています2)あなたのデータをlatin1でエンコードされた文字列として保存しています。したがって、データは誤ってエンコードされて格納されます。

データベースからデータを取得するとき、latin1文字列として提供されますが、latin1文字列は誤ってエンコードされたUTF-8であり、PHPはすべての文字列をバイナリ文字列として処理するので、 8弦をもう一度戻す。この文字列を、UTF-8でエンコードされたHTMLページにエコーすると、文字列はユーザ​​ーによって送信されたとおりに表示されます。

ただし、MySQLの文字セットの扱いについて洗練されたソフトウェアを使用してデータベースの内容を表示すると、そのソフトウェアは列文字セットをlatin1として識別し、文字が実際に文字であることを確認します私たちが注意したように、誤ってエンコードされたUTF-8であるlatin1文字列のしたがって、誤ってエンコードされたデータが表示されます。

これを解決するには、いくつかの手順が必要です。まず、UTF-8でエンコードされたデータ(HTMLのレベルで宣言されている)を処理することを期待しているので、MySQLとの通信方法も確認する必要があります。これは、データベースに接続するたびにSET NAMES 'utf8'を発行して行います。 (注:データベースAPIは接続文字セットを変更するための特別な機能を提供するかもしれませんが、mysql APIはありませんが、わかりません)

第2に、データUTF-8エンコードこれは、データベース列の文字セットがutf8であることを意味します。列の文字セットは、ALTER TABLE ... MODIFYステートメントを使用して変更できます。テーブルのデフォルトの文字セットも変更することを忘れないでください(これは、明示的に文字セットを指定しないテーブルに追加された新しいカラムの文字セットを設定します)。また、データベースのキャラクタ・セットを変更します。

ただし、カラムキャラクタセットを変更すると、MySQLは、そのテーブルの行にすでに格納されているデータは誤ってエンコードされていないと見なしますが、有効なデータは古いキャラクタセットに格納されます。したがって、誤ってエンコードされたUTF-8データ(latin1でエンコードされたデータとして扱う)をUTF-8でエンコードされたデータに変換するので、UTF-8でエンコードされたデータになります。これを回避するには、最初に列文字セットをbinary文字セットに変換し、次にbinaryからutf8に変換します。このようにして、MySQLはデータのバイナリ形式を変更しません。これは、任意のバイナリ文字列として扱われる形式で変換するためです。

幸運を祈る!

関連する問題