2010-12-16 18 views
1

背景: テーブルがあります。この表はlatin1形式です。この表の個々の列はutf8に設定されています。我々が議論するために桜を選ぶ列は、タイトルであり、これはutf8列の1つです。ウェブサイトは、apacheとメタタグの両方でutf8用に設定されています。試験としてPHP 5.2 + mysql 5.1文字エンコーディングの問題

私はタイトルフィールドにdécor or ©を保存し、

select title, LENGTH(title) as len, CHAR_LENGTH(title) as chlen 
from events where length(title) != char_length(title) 

を実行する場合、私は戻って、結果としてdécor or ©, 12, 10を取得します。これはデータが本当に私のutf8列に適切に保存されていることを示すものと期待されます。

しかし、タイトルをページにエコーすると、前述のように、ページ上の文字エンコードがutf-8に設定されているので、それは私には意味がないd�cor or �になります。

この最終的な詳細が異なるかどうかはわかりませんが、ページを編集して変更されたテキストを再送信すると、データベースにもページに表示されてもd%uFFFDcor or %uFFFDになります。さらに提出すると変更されません。

実際の質問: 誰かが私が間違っているかもしれないという考えを持っていますか? :-P

答えて

2

3つの問題の可能性があります。 MySQLの接続が使用されていない

1. UTF-8

これは、それがPHPを打つ前に、別の文字セット(おそらくラテン1)に変換されますことを意味します。

SET CHARACTER SET = "utf8"; 
SET character_set_database = "utf8"; 
SET character_set_connection = "utf8"; 
SET character_set_server = "utf8"; 

2.レンダリングされたページが本当にContent-typeヘッダーと<meta>タグの両方を設定してUTF-8

に設定されていない:私は最善の解決策は、次のクエリを実行することであることがわかりましたコンテンツタイプをUTF-8に変換します。コメントで述べたように、一部のブラウザでは、1つまたは他の...

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

echo '<meta http-equiv="content-type" content="text/html; charset=utf-8" />'; 

を尊重していない、それは問題ではない...

3.あなたは何をやっています文字列をエコーする前に

ほとんどのPHPの文字列関数は、UTF-8でうまく機能しません。 $charsetパラメータを受け付けない通常の関数を呼び出す場合は、utf-8文字列(たとえば、str_replace)では機能しない可能性があります。それは$charsetパラメータ(のようなhtmlspecialcharsを持っている場合は、あなたがそれを設定していることを確認してください

echo htmlspecialchars($content, ENT_COMPAT, 'UTF-8'); 
+0

は2にすることはできません、そうでない場合は代わりに1個の置換文字の文字オフ2があると思います –

+0

@Ignacio:。。良い点...私はそれに応じて編集します – ircmaxell

+0

db接続を開いた直後にブートストラッププロセスで提供されたクエリを実行しようとしました;データベースに保存された結果は次のようになります: 'd?cor or?'と私はvar_dump'dは、他の何かが実行される前にdbから来る結果と違いはありません。これまでの助けてくれてありがとう。 :) – jdsmith2816

関連する問題