3 に答える
MarcB のコメントはまさにそのとおりです。エンコーディングは各レイヤー全体で同じでなければなりません。これをデバッグするには、どのレイヤーのエンコーディングが正しくないかを見つける必要があります。
これを行う:
PHP ソース コードを検索し、MySQL からコンテンツを選択するための実際の呼び出しを行う行を見つけます。
その時点で、文字列を 16 進数でエンコードし、生のバイトが何であるかを確認します。例えば:
// temp, debugging
print("TEST:".bin2hex($whatever_field_value));
die();
あなたが得るものを参照してください。正しくエンコードされた左 UTF-8 の「スマート クォート」は次のようになりますe2809c
。代わりに 1 バイトまたはその他の値が返される場合は、UTF-8 ではありません。この時点で、エンコードの問題が PHP mysqli 呼び出しとデータベースの間のどこかにあることがわかります (明示的に設定されている場合は、mysql フィールドの文字セット、テーブルのデフォルトの文字セット、および接続の文字セットを確認してください。mysqli_set_charset )
(注: 文字の UTF-8 エンコーディングは、テキスト ファイルに UTF-8 として保存し、それを任意のバイナリ エディタで開くかhexdump -C
、Mac/Linux で使用することで簡単に確認できます。[UTF-8 バイト オーダーに注意してください。マーク --efbbbf
一部の編集者はファイルの先頭に配置しますが、それはあなたが探しているものではありません。無視してください])
その時点で正しい場合は、テキストが出力される直前に同じテストを再度実行します (おそらく Joomla テンプレート ファイルの 1 つに)。そこで正しいかどうかを確認してください。
次に、ブラウザ レベルでテストするには、ページを wget (または curl など) します。
wget http://yoursitename/ -O test.html
結果を実行 (またはバイナリ エディターで開く) し、その引用符が必要なhexdump -C
場所を見つけて、生のバイトが何であるかを確認します。
既に述べたように、Content-type HTTP ヘッダーと meta content-type タグは、使用しているエンコーディング (UTF-8) と一致する必要があります。同様に確認してください (wget -S
でヘッダーが表示されます)。ただし、ヘッダーとメタ タグに UTF-8 を指定する必要があるだけでなく、データを実際に UTF-8 としてエンコードする必要があることに注意してください。そのため、上記のように確認する必要があります。
これにより、問題を絞り込むために何を知る必要があるかがわかります。その時点で、修正するために何をする必要があるか、または少なくともセットアップのどの部分が問題を引き起こしているかをすでに知っている可能性があります。
何よりも先に、このクエリを実行してみてください。
mysql_query("SET NAMES 'utf8'");
前回文字セットで問題が発生したのは、他のすべてが UTF-8 であったにもかかわらず (提供されている HTML、私が書いたコード、データベース テーブルなど)、データベース接続がまだすべてを別の文字セットで渡していたためでした。 . これで問題が解決するはずです。
編集:以下の @null.point3r で述べられているように、次のコードを使用することはより良い代替手段です。
$mysqli->set_charset('utf8')
まず、現在のデータベースをエクスポートする必要があります。
# mysqldump -uroot -p databasename > database.sql
次に、latin1 データを utf8 に変換する必要があります。
# iconv -f 'latin1' -t 'utf-8' database.sql > database_utf8.sql
次に、データをインポートして戻します
# mysql -uroot -p databasename < database_utf8.sql
すでに出力エンコーディングと mysql 接続/照合を処理しているため、Apache を介して提供される適切な文字が表示されるはずです :)