19

MySQL DB、テーブル、およびフィールドの照合がutf8_general_ciに設定されていても、éなどの文字がéに変換されることがよくあります。ページのContent-TypeのエンコーディングもUTF8に設定されています。

utf8_encode / decodeについては知っていますが、どこでどのように使用するかについてはよくわかりません。

すべてのソフトウェア開発者が絶対に、Unicodeと文字セットについて絶対に知っておく必要があります(言い訳はありません!)」の記事を読みましたが、MySQL/PHP固有のポインターが必要です。

ユーザーが入力した国際文字を含むデータが破損しないようにするにはどうすればよいですか?

4

5 に答える 5

14

http://www.nicknettleton.com/zine/php/php-utf-8-cheatsheetを最初に見たとき、重要なことが 1 つ欠けていると思います (おそらくこれを見落としていました)。MySQL のインストールおよび/または構成に応じて、接続エンコーディングを設定する必要があります。これにより、MySQL は、クライアント側 (PHP スクリプトである必要がある MySQL 接続のクライアント側を意味します) で期待しているエンコーディングを知ることができます。これを行うには、手動で

SET NAMES utf8

MySQL サーバーに送信する他のクエリの前にクエリを送信します。

PHP 側で PDO を使用している場合は、次を使用して、(再) 接続のたびにこのクエリを自動的に発行するように接続をセットアップできます。

$db=new PDO($dsn, $user, $pass);
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES utf8");

データベース接続を初期化するとき。

于 2008-09-26T18:01:31.050 に答える
8

照合と文字セットは同じものではありません。照合は文字セットと一致する必要があるため、文字セットが utf-8 の場合は照合も一致する必要があります。ただし、間違った照合順序を選択してもデータが文字化けすることはありません。文字列の比較/並べ替えが正しく機能しないようにするだけです。

とはいえ、PHP で文字セットを設定できる場所はいくつかあります。可能であれば、全体で utf-8 を使用することをお勧めします。文字セットを指定する必要がある場所は次のとおりです。

  • データベース。これは、データベース、テーブル、およびフィールド レベルで設定でき、クエリごとのレベルでも設定できます。
  • PHP とデータベース間の接続。
  • HTTP 出力; Content-TypeHTTP ヘッダーが utf-8 を指定していることを確認してください。headerPHP と Apache でデフォルト値を設定するか、PHP の関数を使用できます。
  • HTTP 入力。通常、フォームはページが提供されたのと同じ文字セットで送信されますが、確実にaccept-charsetプロパティを指定する必要があります。また、URL が utf-8 でエンコードされていることを確認するか、URL (および GET パラメーター) で非 ASCII 文字を使用しないようにしてください。

utf8_encode/decode 関数の名前は少し変わっています。特に、latin1 (ISO-8859-1) と utf-8 の間で変換します。アプリケーション内のすべてが utf-8 である場合、それらをあまり使用する必要はありません。

utf-8 と PHP に関して、少なくとも 2 つの落とし穴があります。1 つ目は、PHP の組み込み文字列関数は文字列が 1 バイトであることを想定していることです。strlen多くの操作では、これは問題ではありませんが、他の機能に頼ることができないことを意味します。このページには、制限の概要が記載されています。通常、これは大きな問題ではありませんが、特にサードパーティのライブラリを使用する場合は、これで問題が発生する可能性があることに注意する必要があります。1 つのオプションとして、mb_string 拡張機能を使用することもできます。これには、問題のあるすべての関数を utf-8 対応の代替関数に置き換えるオプションがあります。これはまだ 100% 防弾ソリューションではありませんが、ほとんどの場合に有効です。

もう 1 つの問題は、PHP の一部のインストールでmagic_quotes設定がまだオンになっていることです。この問題は utf-8 とは関係ありませんが、ヘッド スクラッチを引き起こす可能性があります。あなた自身の正気のために、それをオフにしてください。

于 2008-09-27T13:13:13.480 に答える
2

あなたがすべきこと:

  • Apache が UTF-8 コンテンツを出力していることを確認してください。これを httpd.conf で行うか、PHP のheader()-function を使用して手動で行います。
  • データベース接続が UTF8 であることを確認してください。SET NAMES utf8トリックを行います。
  • すべてのテーブルが UTF8 に設定されていることを確認してください。
  • 国際文字を格納する場合は、すべての PHP ファイルとテンプレート ファイルが UTF8 としてエンコードされていることを確認してください。

通常、これを行う場合、mb_stringまたは -関数を使用して多くのことを行う必要はありませんutf8_encode/decode

于 2008-09-27T12:37:39.167 に答える
0

書かれている言語に関係なく、さまざまなエンコーディングを許可するアプリを作成する場合は、分割して処理してください。

  • エンコーディングを特定する
    • なんらかの方法で、扱っているエンコーディングの種類を知りたいと思うでしょう。ジャンク文字になってしまいます。
  • バイトを処理する
    • これらの文字列は、文字の「文字列」ではなく、バイトのリストのように考えてください
    • PHP は特に卑劣です。オンザフライでデータを切り捨てさせないでください。UTF-8 文字列を正規表現している場合は、そのように識別してください。
  • LCD用ストア
    • 繰り返しますが、データを切り捨てたくありません。英語の文を保存している場合、中国語のグリフのセットも保存できますか? アラビア語はどうですか?これらのうち、最も多くのスペースを必要とするのはどれですか? それを説明してください。
于 2008-09-27T19:30:38.957 に答える
0

Unicode の正確性を高めるには、utf8_unicode_ci を使用する必要があります (ただし、ドキュメントでは違いが少し曖昧です)。また、次の Mysql フラグが正しく設定されていることを確認する必要があります -

  • デフォルト文字セット=utf8
  • skip-character-set-client-handshake //重要なので、クライアントは別のエンコーディングを強制しません

これらは、mysql 構成ファイル ([mysqld] タブの下) で設定するか、実行時に適切なクエリを送信して設定できます。

于 2008-09-26T18:04:57.157 に答える