ユーザーのブラウザが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はデータのバイナリ形式を変更しません。これは、任意のバイナリ文字列として扱われる形式で変換するためです。
幸運を祈る!
あなたのデータベースで、接続と出力のためにどんな文字エンコードを使用していますか? – Gumbo
これはこれですか?DEFAULT CHARSET = latin1; – dotty
使用しているロケール/キャラクタセットがわからなくても、それを元に戻すことはできません – stillstanding