0

基本的に文字を入力できる単なるテキストエリアであるテスト プログラムを作成しました。[送信] をクリックすると、文字が MySQL テスト テーブル (PHP を使用) に書き込まれます。

テストテーブルの照合はUTF-8です。

éまたはを書き込みたい場合、スクリプトは正常に動作úし、データベースに正常に書き込みます。しかし、次のメタステートメントを<head>ページの領域に追加すると:

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

...文字がごちゃごちゃし始めます。

私の理論では、サーバーは適切に機能するエンコーディングを強制していますが、UTF-8 ディレクティブを追加すると、このサーバー エンコーディングがオーバーライドされ、この UTF-* エンコーディングにはéやなどの文字が含まれないというものúです。しかし、UTF-8 はすべての文字 (クリンゴン語など) をエンコードしていると思いました。

基本的に私のプログラムは機能しますが、ディレクティブを追加しても機能しない理由を知りたいです。私は何かが欠けていると思います。

どんな助け/教えも大歓迎です。

前もって感謝します。

4

1 に答える 1

1

まず、PHP は通常、Unicode 文字セットまたは UTF-8 文字エンコーディングを処理しません。(注意して使用する) mb_... 関数を除いて、文字列をバイナリ データとして扱うだけです。

次に、使用している文字セット/エンコーディングを MySQL クライアント ライブラリに伝える必要があります。'SET NAMES' SQL コマンドがその仕事を行い、さまざまな MySQL クライアント (mysql、mysqli など) がさまざまな方法でアクセスを提供します。たとえば、http: //www.php.net/manual/en/mysqli.set- charset.php

お使いのブラウザと MySQL クライアントはおそらく両方とも latin1 にデフォルト設定されており、偶然にも一致しています。MySQL は、latin1 バイナリ データを UTF-8 に変換することを認識します。ブラウザの文字セット/エンコーディングを UTF-8 に設定すると、MySQL クライアントはその UTF-8 データを latin1 として解釈し、誤ってトランスコーディングします。

したがって、解決策は、MySQL クライアントを、ブラウザーから PHP への入力と一致する文字セットに設定することです。

また、テーブルの照合はテーブルの文字セットと同じではないことに注意してください。照合とは、文字列がどのように比較およびソートされるかを指します。紛らわしいもの、これが役立つことを願っています!

于 2010-08-26T12:36:04.023 に答える