5

エンコーディングに関してPHPで問題が発生しています。

$.post を使用して PHP スクリプトと対話する JavaScript/jQuery HTML5 ページがあります。しかし、PHP はおそらくエンコーディングに関連した奇妙な問題に直面しています。

私が書くとき

htmlentities("í")

PHPが出力することを期待していますí。ただし、代わりに出力されますí 最初は、エンコーディングを間違えていると思いましたが、

htmlentities("í")=="í"?"Good":"Fail";

「失敗」を出力しています。

htmlentities("í")=="í"?"Good":"Fail";

しかしhtmlentities($search, null, "utf-8")、期待どおりに動作します。

PHP を MySQL サーバーと通信させたいのですが、utf8_encode を使用してもエンコーディングの問題があります。私は何をすべきか?

編集:SQLコマンドで、書き込み

SELECT id,uid,type,value FROM users,profile
WHERE uid=id AND type='name' AND value='XXX';

XXX には í 文字が含まれていませんが、期待どおりに動作しますが、「í」文字がある場合は機能しません。

SET NAMES 'utf8';
SET CHARACTER SET 'utf8';
SELECT id,uid,type,value FROM users,profile
WHERE uid=id AND type='name' AND value='XXX';

í 文字で失敗するだけでなく、「特殊」文字を含まない文字列でも失敗します。SET NAMES と SET CHARACTER SET から ' 文字を削除しても、何も変わらないようです。

PDO を使用して MySQL データベースに接続しています。

編集 2: Linux 用の XAMPP の MySQL バージョン 5.1.30 を使用しています。

編集 3: SHOW VARIABLES LIKE '%character%'PhpMyAdmin 出力からの実行

character_set_client    utf8
character_set_connection    utf8
character_set_database  latin1
character_set_filesystem    binary
character_set_results   utf8
character_set_server    latin1
character_set_system    utf8
character_sets_dir  /opt/lampp/share/mysql/charsets/

PHP スクリプト (print_r を使用) から同じクエリを実行すると、次のように出力されます。

Array
(
    [0] => Array
        (
            [Variable_name] => character_set_client
            [0] => character_set_client
            [Value] => latin1
            [1] => latin1
        )

    [1] => Array
        (
            [Variable_name] => character_set_connection
            [0] => character_set_connection
            [Value] => latin1
            [1] => latin1
        )

    [2] => Array
        (
            [Variable_name] => character_set_database
            [0] => character_set_database
            [Value] => latin1
            [1] => latin1
        )

    [3] => Array
        (
            [Variable_name] => character_set_filesystem
            [0] => character_set_filesystem
            [Value] => binary
            [1] => binary
        )

    [4] => Array
        (
            [Variable_name] => character_set_results
            [0] => character_set_results
            [Value] => latin1
            [1] => latin1
        )

    [5] => Array
        (
            [Variable_name] => character_set_server
            [0] => character_set_server
            [Value] => latin1
            [1] => latin1
        )

    [6] => Array
        (
            [Variable_name] => character_set_system
            [0] => character_set_system
            [Value] => utf8
            [1] => utf8
        )

    [7] => Array
        (
            [Variable_name] => character_sets_dir
            [0] => character_sets_dir
            [Value] => /opt/lampp/share/mysql/charsets/
            [1] => /opt/lampp/share/mysql/charsets/
        )

)

ランニング

SET NAMES 'utf8';
SET CHARACTER SET 'utf8';
SHOW VARIABLES LIKE '%character%'

空の配列を出力します。

4

3 に答える 3

18

最後の例で行ったように、入力のエンコーディングと一致するようにhtmlentitiesのエンコーディングを指定することが非常に重要ですが、最初の 3 つでは省略されています。

htmlentities($text,ENT_COMPAT,'utf-8');

MySQL との通信に関しては、接続の照合順序と文字セットが送信するデータと一致していることを確認する必要があります。これは、構成ファイルで設定するか、実行時に次のクエリを使用して設定できます。

SET NAMES utf8;
SET CHARACTER SET utf8;

テーブル、データベース、およびサーバーの文字セットも一致していることを確認してください。実行時に変更できない設定が 1 つあります。それはサーバーの文字セットです。構成ファイルでそれを変更する必要があります。

[mysqld]
character-set-server = utf8
default-character-set = utf8 
skip-character-set-client-handshake

マニュアルで、MySQL の文字セットと照合の詳細を参照してください。

于 2009-01-01T23:41:56.497 に答える
7

復活が遅い。しかし、さらに参考にするために、いくつかの追加のヒントを以下に示します。

  1. の代わりにmysql_set_charsetを使用します。SET xxx
  2. ファイルを UTF-8 エンコーディングで保存していることを確認してください (これは見過ごされがちです)。
  3. ヘッダーを設定します。
    <?php header("Content-type: text/html; charset=utf-8"); ?>

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

  4. Apache サーバーの設定に異なるエンコーディングのAddDefaultCharsetディレクティブが含まれている場合は、ホスト管理者に怒鳴りつけてください。
于 2011-08-23T17:13:50.803 に答える
1

この問題に遭遇しました。ウェブサイト全体のコンテンツがスペイン語であり、期待できるすべての特殊文字 (áéíóúñ) とその大文字バージョンが含まれています。

私の場合、サーバーの文字セット/照合との不一致でした。他のすべては utf8 に設定されましたが、サーバーの文字セットは latin1 でした。これにより、データベースに入力されたすべての utf8 データが生のエンコードされた形式で表示されるようになりました。

私は mysqli を使用しており、それを修正するために、上記で Anthony Accioly が説明した方法 (mysql_set_charset を使用) を利用しました。上記の方法にはmysqliバージョンがあり、それが私が使用したものです。

その後、私は戸惑いました。自分のウェブサイトを表示するとき、私はまだ混乱していました。もちろん、その latin1 を utf8 に変更すると、全体の文字エンコード/デコードも台無しになるとは知りませんでした。そこで、オンラインの文字列エンコーダー/デコーダーを使用して、テーブル データを修正しました。

すべてのコンテンツ データのさまざまなエクスポートを作成し (更新クエリを取得するように設定でき、更新プロセスが高速になります)、前述のオンライン エンコーダー/デコーダーを介して SQL 出力を実行し、固定クエリをコピーして貼り付けました。 phpmyadmin sql パネル...したがって、エンコードエラーを修正します。すべてが本来あるべき姿になり、不可逆検索を再び処理できるようになりました。Maria、maria、maria、maria はすべて maría、maria、Maria などと一致します。すべての急性文字は、基本母音文字に評価されます。エピックウィン。

于 2012-12-13T20:25:00.173 に答える