2012-01-22 4 views
2

私はCLEditor richtext controlのPHPウェブサイトを持っています。ユーロと英国ポンドをデータベースに書き込もうとすると、その文字セットは、HTML、リッチテキストコントロールIFRAME HTML、およびMySQLテーブルの照合順序でUTF-8に設定されているため、正常に処理されます。すべてがその前にうまくいます。しかし、私はsmart quotesを書くしようとすると、私はデータベースにこの出力を見終わる:それは正しく、あなたのブラウザーでは、上記表示されない場合PHPとMySQLでは、スマートな引用符をデータベースに正しく書き込むにはどうすればよいですか?

This is a “testâ€. 

(、テスト単語はラテン語のようなものを持っています、ユーロ記号、単語の前に小さなAE記号、それに続くラテンAとユーロ記号)

PHPを使用してその値をデータベースから読み出してページに表示するとそれは疑問符が付いた黒い菱形とその他のラテン文字で終わってしまいます。

これを解決するにはどうすればよいですか?

答えて

3

まず、MySQLテーブルがエンコードにUTF-8を使用していることを確認してください。もしそうであれば、それは次のようになります。

<html> 
    <head> 
     <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> 
    </head> 
    .... 
</html> 

そして、それが動作するはずです:

mysql> SHOW CREATE TABLE Users (
... 
) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8 | 

次に、あなたのHTMLページがUTF-8を表示するように設定されていることを確認してください。


編集:私は意図的に私はそれがすでに考えられていたと思ったので、照合の話を、誰もの利益のために、私はこの答えにいくつかのより多くを追加できませんでした。

あなたの状態、

私はMySQLのテーブルの照合順序で... UTF-8に設定する文字セットを持っています。

テーブルの照合は、charsetと同じではありません。

照合は、自動的に1つの文字セットを別の文字セットに変換しようとする行為です。照会の目的のためにです。たとえば、latin1のキャラクタセットとUTF-8の照合順序があり、SELECT * FROM foo WHERE bar LIKE '% - %'のような操作を行うとします。 latin1の文字セットがL + 0151 または U + 2014のいずれかと一致するテーブルに、文字列(UTF-8 U + 2014)を挿入します。あなたはUTF-8エンコーディングされたWebページの上にこのlatin1のエンコードされた文字を出力した場合のように偶然

ない...、あなたは次のようなります。

これは“testâ€です。

あなたの問題の出力であるようです。

<?php 
$string = "This is a “test”."; 
?> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html;charset=utf8"/> 
    </head> 
    <body> 
     <p><?php echo $string; ?></p> 
    </body> 
</html> 

このファイルをlatin1に保存することを忘れないでください。

あなたのテーブルには、このクエリを実行するように設定されている文字セット内容を確認するには、次の(あなたの複数の英語以外の言語を使用しているがない限り)で、あなたの用途に

SELECT CCSA.character_set_name, TABLE_COLLATION FROM information_schema.`TABLES` T, 
     information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` CCSA 
WHERE CCSA.collation_name = T.table_collation 
    AND T.table_schema = "database" 
    AND T.table_name = "table"; 

のみ適切な結果を:

+--------------------+-----------------+ 
| character_set_name | TABLE_COLLATION | 
+--------------------+-----------------+ 
| utf8    | utf8_general_ci | 
+--------------------+-----------------+ 

おかげupvotes ;-)私はここで答えを見つけ

+0

私はあなたの非常に賢明な応答に感謝しているので、ひどいことではありません。Theodore - あなたは優れた答えで過去のPHP OOPの質問に私を助けてくれました。しかし、ここに応答するには、そこに行って、それを行ってください。私はすでに私のポストに言及しました。他のほとんどのUTF-8のものはすでに動作していることに注意してください。それはちょうどファンキーな演技をしているちょっとした引用符です。 – Volomike

+0

私は正直言って、あなたが上記を試したと言ったところを見ませんでした。私はそれを再度読んだが、あなたがこれを言及した場所をまだ見ることができない; /私はあなたに一般的に何が問題であるかを示した。 3番目のステップは入力文字を確認することです。しかし、私はあなたがすでにそれを考えていると考えました。私は間違っていたと思います。 –

+0

"ユーロと英国ポンドをデータベースに書き込もうとすると、その文字セットは、HTML、リッチテキストコントロールIFRAME HTML、およびMySQLテーブルの照合順序でUTF-8に設定されているため、すべてがその前にうまくいっている」 – Volomike

-1

https://stackoverflow.com/a/1262210/105539

これは、私のユーロと英国ポンドの文字を妨害しないようです。

+0

これはあなたの問題に対する非常に安全な答えではないかと疑いがあります。ユーザーが©、または - に貼り付けるとどうなりますか?あなたのアプリはあらゆる種類の文字を表示します。 PHPの文字列関数に頼るのではなく、入力と出力を正しく取得するのが最適です。 –

+0

私はそれらの文字を試しました。彼らは私が思いついたシステムでうまく動作します。私はHTMLをUTF-8として、データベーステーブルをUTF-8として持っています。データに行うのはstripslashesでトリムし、上記の例のリンクを使用してMS文字のstrstrを実行します。 – Volomike

0

内容が印刷される前に、PHPファイルの先頭にこのファイルがあることを確認してください。私はlatin_swedish_ciをutf8でエンコードされたWebサイトに取り込み、正しくエンコードできます。

header("Content-type: text/html;charset=UTF-8");

私はまた私のデータベース接続(これは同じくらい重要かどうかわからない)した後にこれを置く:それはこの記事accross来て、誰のために価値がある何のため

mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET 'utf8'");

0

、私が見つかりました。これらのmysqld設定行を追加すると、mysqlサーバにアクセスして変更を加えることができれば、中括弧で囲まれた問題を解決できます。

http://dev.mysql.com/doc/refman/5.6/en/charset-server.html

# Force UTF8 Charset Encoding 
skip-character-set-client-handshake 
collation_server=utf8_unicode_ci 
character_set_server=utf8 

Iは、(細かい登場)PHPから呼び出されるダブルチェックSQLを持っていたし、また、手動で(うまく働いた)私のGUIからの巻き毛引用符で挿入/更新なステートメントを実行Webサーバからはまだマルチ制御文字がデータベースに挿入されていました。

mysqlサーバの変数を調べたところ、latin1がサーバとデータベース(テーブル/カラムがUTF8であっても)のデフォルトであることに気付きました。上記の行を追加し、更新ステートメントを発行したページをリフレッシュすると、中括弧が正しく挿入されました。私はこれが、サーバのデフォルトのcharsetがlatin1であり、Webサーバのmysqlライブラリハンドシェイクがそれと同じようにネゴシエーションを行うことと何らかの関係があると仮定することができます。

関連する問題