2

CLEditor リッチテキスト コントロールを含む PHP Web サイトがあります。ユーロと英国ポンドをデータベースに書き込もうとすると、含まれているページの HTML、リッチテキスト コントロールの IFRAME HTML、および MySQL テーブル照合で文字セットが UTF-8 に設定されているため、文字は正常に処理されます。その面ではすべて順調です。ただし、 smart quotesを書き込もうとすると、データベースに次の出力が表示されます。

This is a “testâ€.

(ブラウザで上記が正しく表示されない場合、テスト単語には、単語の前にラテン語の a、ユーロ記号、および小さな AE 記号があり、その後にラテン語の a とユーロ記号が表示されます。 )

PHP を使用してその値をデータベースから読み込んでページに表示すると、他のラテン文字と同様に疑問符が付いた黒いひし形になります。

これを修正するにはどうすればよいですか?

4

4 に答える 4

3

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

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

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

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

その後、動作するはずです。


編集:すでに検討されていると思ったので、意図的に照合については話しませんでしたが、すべての人のために、この回答にさらに追加させてください。

あなたは次のように述べています。

MySQLテーブルの照合で文字セットをUTF-8に設定しています...。

テーブル照合は文字セットと同じではありません。

照合は、クエリの目的で、ある文字セットを別の文字セットに自動的に変換しようとする行為です。たとえば、latin1 の文字セットと UTF-8 の照合があり、SELECT * FROM foo WHERE bar LIKE '%—%'; のようなことをするとします。L+0151またはU+2014のいずれかに一致する latin1 の文字セットを持つテーブルの (UTF-8 U+2014) 。

偶然ではありません...このlatin1でエンコードされた文字をUTF-8でエンコードされたWebページに出力すると、次のようになります:

これは「テスト」です。

それはまさにあなたの問題の出力のようです。これを複製する HTML は次のとおりです。

<?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 |
+--------------------+-----------------+

賛成票をありがとう;-)

于 2012-01-22T19:54:31.993 に答える
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

PHP から呼び出されている SQL を再確認し (問題ないように見えました)、GUI からカーリー クォートを使用して挿入/更新ステートメントを手動で実行しました (問題なく動作しました) が、Web サーバーからはまだマルチコントロールを取得していました。データベースに挿入された文字。

mysql サーバー変数を確認したところ、latin1 がサーバーとデータベースのデフォルトであることがわかりました (テーブル/列は UTF8 でしたが)。上記の行を追加し、更新ステートメントを発行したページを更新すると、中引用符が正しく挿入されました。これは、サーバーのデフォルトの文字セットが latin1 であり、Web サーバーの mysql ライブラリ ハンドシェイクがそのようにネゴシエートしていることと関係があるとしか思えません。

于 2015-06-07T04:16:20.623 に答える