質問

MySQL DBの照合順序テーブルであるにもかかわらず、é などの文字がé に変換されることがよくありますフィールドはutf8_general_ciに設定されます。ページの Content-Type のエンコードもUTF8に設定されます。

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

私は" すべてのソフトウェア開発者が絶対的かつ積極的にUnicodeについて知っていなければならない絶対最小値を読みました。文字セット(言い訳なし!)"記事ですが、MySQL / PHP固有のポインターが必要です。

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

役に立ちましたか?

解決

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

を発行します
SET NAMES utf8

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

PHP側でPDOを使用している場合は、接続を設定して、使用することにより(再)接続するたびにこのクエリを自動的に発行できます

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

db接続を初期化するとき。

他のヒント

照合順序と文字セットは同じものではありません。照合は文字セットと一致する必要があります。したがって、文字セットがutf-8である場合、照合も一致する必要があります。ただし、間違った照合を選択してもデータが文字化けすることはありません-文字列比較/ソートを誤って動作させるだけです。

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

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

utf8_encode /デコード関数は少し奇妙な名前が付けられています。特に、latin1(ISO-8859-1)とutf-8の間で変換します。アプリケーションのすべてがutf-8であれば、あまり使用する必要はありません。

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

もう1つの問題は、PHPのインストールによっては、 magic_quotes 設定がオンになっている。この問題はutf-8に直交していますが、頭に傷を付ける可能性があります。あなた自身の正気のために、それをオフにしてください。

この記事でカバーされていないことはあまり言わない

http://developer.loftdigital.com/blog/php-utf -8-チートシート

すべきこと:

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

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

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

  • default-character-set = utf8
  • skip-character-set-client-handshake //重要であるため、クライアントは別のエンコーディングを強制しません

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

記述されている言語に関係なく、幅広いエンコーディングを許可するアプリを作成する場合は、分割して処理します:

  • エンコードを識別する
    • どういうわけか、あなたがどんな種類のエンコーディングを扱っているかを知りたいのですが、そうでなければ、それをさらに検討するのはかなり無意味です。最終的にはジャンク文字になります。
  • バイトを処理する
    • これらの文字列は、文字の「文字列」ではなく、バイトのリストに似ていると考えてください
    • PHPは特に卑劣です。その場でデータを切り捨てないでください。 UTF-8文字列を正規表現している場合は、必ずそのように識別してください
  • LCDの保管
    • 再び、データを切り捨てたくありません。英語で文を保存している場合、マンダリンglyphpのセットも保存できますか?アラビア語はどうですか?これらのどれが最もスペースを必要としますか?それを説明します。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top