Web 開発では、フロントエンド Web ページ、php および mysql データベースの文字エンコーディングがよく関係します。 end web pages-php- —データが英語のみの場合、mysql 間のデータ対話は通常問題を引き起こしませんが、中国語が含まれると、3 つの場所の文字エンコーディングが不一致になります (たとえば、Web ページでは gbk と gbk が使用され、 mysql は utf-8 を使用しています) 文字化けが発生する可能性があります。 fr=aladdin)
フロントエンド Web ページのコーディング:通常、私たちは皆、
タグで 項目を渡すことができると考えています。 ( など) ページ全体の文字エンコーディングを設定します。ほとんどのページは、このメソッドを使用してブラウザに内容を伝えることができます。このページを表示するときに使用するエンコーディングですが、この文はまだ機能しないことがわかります。どの xxx であっても、ブラウザは常に同じエンコーディングを使用します。この状況には、 http プロトコル通信. 実際、ユーザーが Web ページを閲覧すると、サーバーからユーザーに送信されるコンテンツには、Web ページ (html/css/js などのコード コンテンツを含む) だけでなく、ヘッダー: 何が起こるかをクライアントに伝えます。受信したデータのタイプ (HTML、プレーン テキスト、マルチメディア ファイルなど)、サイズ、ソース、その他の情報 (この情報を確認したい場合は、 (ブラウザ経由ではなく) Telnet ツールを使用して、http プロトコルに従って get およびその他のリクエストを自分で開始してください) ヘッダーは HTML より前に送信されるため、HTML の一部である の優先順位はヘッダーよりも低くなります。ヘッダーに既に Web ページの文字エンコーディングの記述が含まれている場合、ブラウザーは最終的にヘッダーで指定された文字エンコーディング セットに従って Web ページを解析します。
PHP では、ヘッダーを使用できます。 ("content-type:text/html; charset=xxx"); 文字セットDepartmentに関するヘッダーを送信します。
ApacheサーバーにはAddDefaultCharset関数があり、対応するヘッダーが送信される各 Web ページのサーバーのデフォルト文字セットに従って設定する必要があります。
/etc/apache2/httpd.conf (2.4 より前) または /etc/apache2/conf-available/charset.conf (2.4 以降) を確認してください。 AddDefaultCharset xxxという文がありますが、この文がコメント化されていない場合は、Webページごとにデフォルトの文字セットヘッダーを追加する機能がオンになります。このとき、タグに文字セットを設定します。だけでは効果はありません。
注: HTML ページに示されているエンコード方法は、HTML ページ (実際にはプレーン テキスト) を実際に保存するために使用されるエンコード方法と一致している必要があります。
一般に、中国語やその他の言語と互換性を持たせるには、utf-8 エンコードを使用するのが最も問題のない方法です。utf-8 は世界中で一般的に使用されているほぼすべての言語をサポートしているためです。 。
mysql データベース エンコーディング:ターミナルで mysql -uusername -ppassword を実行し、mysql 制御プログラムを入力して、「character%」のような show variables を入力します (注) mysql ターミナルでコマンド ステートメントまたは SQL ステートメントを入力する場合、セミコロンは省略できません) 次のような図が表示されます。
上記は、使用される文字セットのリストです。さまざまなレベルで mysql によって実行されます。 (*)
character-set-server/default-character-set: デフォルトで使用されるサーバー文字セット。
character-set-database: データベースの文字セット。character-set-table: データベース テーブルの文字セット。
優先順位は順番に増加します。したがって、通常はキャラクタ・セット・サーバーを設定するだけでよく、データベースやテーブルの作成時にキャラクタ・セットを指定する必要はなく、キャラクタ・セット・サーバーのキャラクタ・セットが統一的に使用されます。
character-set-client: クライアントの文字セット。クライアントのデフォルトの文字セット。クライアントがサーバーにリクエストを送信すると、リクエストはこの文字セットでエンコードされます。
character-set-results: 結果の文字セット。サーバーが結果または情報をクライアントに返すとき、結果はこの文字セットでエンコードされます。
クライアント側では、character-set-results が定義されていない場合、character-set-client 文字セットがデフォルトの文字セットとして使用されます。したがって、設定する必要があるのは、character-set-client 文字セットのみです。
したがって、上の図に示されている文字セットサーバーは utf8 を使用していないことがわかります (注: mysql では、utf-8 エンコード方式は「-」なしで utf8 と表現されます)。これは、mysql のデフォルトの保存方法がそのまま latin1 になっているためです。この場合、mysql ターミナルを使用してデータベースとデータ テーブルを作成するときに、使用する文字セットが SQL ステートメントで指定されていない場合、格納に使用されるエンコードは latin1 になります。当然、中国語の文字は元々このエンコード方法で格納されます。ラテン語のテキストを保存するために使用されるものは、表示されると確実に文字化けします。
それでは、どのように変更すればよいでしょうか? setcharacter-set-server = utf8; を使用できます (character-set-server の優先度が高いため、これを変更するだけで、データベース ストレージのエンコード方式を変更するのと同じ効果が得られます) )。その後、SQL を使用してターミナルにテーブルを作成すると、テーブルのストレージ エンコード方式は UTF-8 になります。
ただし、この変更は現在のサービスに対してのみ有効です。quit; を使用して終了し、再度 mysql ターミナルに入ると、文字セットが latin1 に戻っていることがわかります。私がこれまでに見つけた情報によると、変更を永続化する方法は、mysql の再コンパイル時にコンパイル パラメータを変更することによってのみ実現されます。コンパイルせずにこれを実現する方法を知っている専門家がいたら、メッセージを残して私に知らせてください。
php エンコーディング:
では、mysql に関して言えば、php は、mysql と対話する際のデータ送信プロセス中に文字化けが発生しないことをどのように保証するのでしょうか?
(*) の説明によると、実際には、mysql へのデータの格納および取得時の文字化けを防ぐためには、次の 3 つのシステム パラメータをサーバーの文字セットの文字に一致するように設定するだけで済みます。 set - サーバーと同じ文字セット。
character_set_client: クライアントの文字セット。
character_set_results: 結果の文字セット。
character_set_connection: 接続文字セット。
これら 3 つのシステム パラメータの設定は、次のステートメントを MySQL に送信することで実現できます: set names xxx (xxx は utf8 にすることができます)
したがって、中国語やその他の英語以外の文字を php から MySQL に送信する場合は、 mysql では、mysql_connect ステートメントの後に mysql_query("set names utf8"); ステートメントを使用すると (データベース ストレージが utf8 を使用していると想定されます)、安全に中国語を送信および取得できます。
さらに、HTML ページは実際には PHP によって動的に生成される可能性があるため、PHP で動的に生成されるページで使用されるエンコード方式が、ヘッダーまたは で宣言されたものと同じであることを確認するにはどうすればよいでしょうか?
php ディレクトリで php.ini ファイルを見つけ、default_charset = "utf-8" を変更して、php がページを出力するときにエンコードに utf-8 を使用するようにします。
推奨学習: 「PHP ビデオ チュートリアル 」