ホームページ  >  記事  >  バックエンド開発  >  PHPにおける漢字の文字コード変換方法を徹底解説

PHPにおける漢字の文字コード変換方法を徹底解説

WBOY
WBOYオリジナル
2016-07-25 08:53:46987ブラウズ
この記事では、PHP での中国語の文字エンコード変換に関する知識を紹介し、PHP エンコード変換の原理と方法を分析します。必要な友人は参考にしてください。

mysql4.1 文字セットの理解に関して、PHP が mysql のこの変更にどのように適応するかについて話しましょう。 mysql5 以降のバージョンにも適用されます。

1.原則 MySQL の文字セットには 2 つの概念があり、1 つは「文字セット (文字セット)」、もう 1 つは「照合順序」です。 1.照合順序 照合順序は中国語で「検証」と訳されます。この語彙は MySQL でのみ使用されます。たとえば、ASCII 文字セットでは、照合順序は MySQL での文字の比較をガイドすることです。 b より小さい、a が a に等しい、a が a に等しいかどうかなど。各文字セットにはデフォルトの照合順序があるため、通常はデフォルトの照合順序を使用するだけで済みます。 2.キャラクターセット 対照的に、文字セットはより広い概念であり、Windows の通常のテキスト ファイルにも文字セットの問題が含まれます。異なる文字セットは、異なる文字エンコード方式を指定します。文字セットは、記号とエンコーディングのセットです。たとえば、ASCII 文字セットには、数字、大文字、小文字、セミコロンなどの記号、および改行が含まれます。エンコーディング方法は 7 ビットを使用して文字を表します。 a のエンコーディングは 65、b のエンコーディングは 98)。 ASCII は英語の文字のエンコードのみを規定しています。英語以外の言語は ASCII エンコードで表すことができません。たとえば、我が国では gb2312 エンコードが使用されています。ただし、エンコーディングは各国で異なり、クロスプラットフォームの問題もいくつかあります。このため、いくつかの国際標準化団体が国際的に受け入れられるエンコーディングを開発しており、最も一般的に使用されているのは utf8 です。 ascii は英語記号と英語文字のみをエンコードし、gb2312 は英語記号、英語文字、中国語文字をエンコードし、utf8 は世界中のすべての言語をエンコードします。したがって、gb1212 文字には ascii 文字が含まれ、utf8 には gb2312 文字が含まれます。 utf8 は最も広範囲の文字を含む文字セットであることがわかります。そのため、一部の多言語 Web システムでは、通常、utf8 文字セットが使用されます (phpmyadmin は utf8 エンコーディングを使用します)。 テキストの保存には文字セットの概念が含まれます。データベースと通常のテキスト ファイルが含まれます。

主な用語: 文字:漢字、英字、句読点、ラテン語など。 エンコーディング: 文字をコンピューターの記憶形式に変換します。たとえば、a は 65 で表されます。 文字セット: 文字と対応するエンコード方式のセット。 a.mysql 文字セット MySQL は現在、複数の文字セットをサポートし、異なる文字セット間の変換をサポートしています (移植性を促進し、多言語をサポートするため)。 MySQL では、サーバー レベルのキャラクタ セット、データベース レベルのキャラクタ セット、データ テーブル レベルのキャラクタ セット、およびテーブル カラムのキャラクタ セットを設定できます。実際、キャラクタ セットが使用される最終的な場所は、たとえば、次のような文字を格納するカラムです。 table1 のcol1列を文字に設定すると、col1は文字セットのみを使用します。 table1テーブルのcol2列がint型の場合、col2は文字セットの概念を使用しません。 サーバー レベルのキャラクタ セット、データベース レベルのキャラクタ セット、およびデータ テーブル レベルのキャラクタ セットはすべて、列キャラクタ セットのデフォルト オプションです。 MySQL には文字セットが必要です。文字セットは、起動時、コンパイル中、または設定ファイルにパラメータを追加することで指定できます。 mysql サーバーの文字セットはデータベース レベルのデフォルトにすぎません。データベースの作成時に文字セットを指定できます。指定しない場合は、サーバーの文字セットが使用されます。同様に、テーブルを作成するときに、テーブルレベルのキャラクタセットを指定できます。指定しない場合は、データベースキャラクタセットがテーブルキャラクタセットとして使用されます。列を作成するときに、列の文字セットを指定できます。指定しない場合は、テーブルの文字セットが使用されます。 通常、設定する必要があるのはサーバー レベルのキャラクタ セットのみです。他のデータベース レベル、テーブル レベル、および列レベルのキャラクタ セットは、サーバー レベルのキャラクタ セットから継承されます。 utf8 は最も幅広い文字セットであるため、通常の状況では、mysql サーバーレベルの文字セットを utf8 に設定します。

b. 通常のテキストの文字セットの問題 テキストの保存には文字セットの問題があり、通常のテキスト ファイルも例外ではありません。 Windows 2000 以降のシステムでは、メモ帳を開いて [名前を付けて保存...] ダイアログ ボックスに入ると、テキストを保存するためのエンコード方法を選択できるオプションがあります。 通常、誰もが Windows 2000 以降のシステムを使用しており、デフォルトのエンコーディングを使用しているため、文字セットの問題は発生しません。 Windowsではテキストファイルを保存する際にエンコード方式を選択できますが、テキストファイルを開く際にはエンコード方式が自動的に決定されます。 Windows 2000 以降のメモ帳を使用して China Mobile および China Unicom をプレイするというジョークがインターネット上にあります。この問題は、Windows がテキスト ファイルを開く際の誤ったエンコーディングの判断が原因であることがわかります。 エンコードの自動判定は誤ることがあるため、テキストファイルによっては、自分で使用しているエンコードを識別する方法を指定している場合があります。 html ファイルはその一例です。 htmlはテキストファイルです。 HTML ファイルを保存するときは、エンコーディングを使用する必要があります。HTML ファイルでは、(たとえば) ファイルで使用されるエンコーディングを指定するために HTML 構文も使用されます。 HTML ファイルでエンコードが指定されていない場合、ブラウザはファイルのエンコードを自動的に識別します。 html でエンコーディングが指定されている場合、ブラウザは html で指定されたエンコーディングを使用します。 通常、HTML ファイルに指定されている文字セットは HTML ファイル自体のエンコーディングと一致していますが、不一致の場合は Web ページが文字化けします (ここでの文字化けはテキストに関するもののみです)。専用の Web ページ編集ツール (Dreamwave など) を使用すると、Web ページの文字セット値に基づいてファイルが自動的にエンコードされます。

c. php+mysqlの文字セットの問題 PHP が最終的に生成するのはテキスト ファイルですが、データベースからテキストを取得するか、データベースにテキストを保存する必要があります。 MySQL はデフォルトで複数の文字セットをサポートしているため、PHP がどのようなコード化文字を送信するかを MySQL は認識しません。そのため、MySQL はクライアント (php) にどの文字セットにアクセスするかを通知する必要があります。 Character_set_client を設定することで、php はデータベースに格納するエンコード方式を mysql に伝えます。 Character_set_results を設定することで、php は mysql にどのような種類のエンコードされたデータを取得する必要があるかを伝えます。 Character_set_connection を設定することにより、php は mysql に php クエリ内のテキストに使用するエンコーディングを指示します。 mysql は、設定されたエンコーディングを使用してテキストを保存します。 MySQL がテキストの保存に setserver を使用し、PHP のcharacter_set_client が setclient で、PHP のcharacter_set_results が setresult であると仮定します。次に、mysql は、php から送信されたテキストを setclient エンコーディング メソッドから setserver エンコーディング メソッドに変換し、データベースに保存します。php がテキストを取得すると、mysql はテキストを setserver から setresult に変換して、php に送信します。 php ファイル (最終的に生成される html ファイル) 自体にコードが含まれています。mysql によって渡されるコードが php ファイル自体のコードと異なる場合、Web ページ全体が文字化けします。したがって、PHP は通常、MySQL に独自のエンコード方式を指示します。 コードが文字化けしないようにするには、3 つのコードを統合する必要があります。1 つは Web ページ自体のコード、2 つ目は HTML で指定されたコード、3 つ目は PHP が mysql に伝えるコード (character_set_client と文字セットの結果)。 dw などのエディターを使用して Web ページを作成する場合、1 番目と 2 番目のコードは通常一貫していますが、メモ帳を使用して Web ページを作成する場合は一貫性がなくなる可能性があります。 3 番目のエンコードでは、mysql への手動通知が必要です。このステップは、php で mysql_query("set namescharacterx") を使用することで実現できます。

d.文字セット変換の問題 小さい文字セットを大きい文字セットに変換してもデータは失われませんが、大きい文字セットを小さい文字セットに変換するとデータが失われる可能性があります。 たとえば、utf8 の一部の文字は gb2312 には存在しない可能性があるため、utf8 から gb2312 に変換すると一部の文字が失われる可能性があります。 ただし、最初に gb2312 から utf8 に変換し、次に utf8 から gb2312 に変換する場合、最初に変換されるテキストはすべて gb2312 の文字であるため、データは失われません。 gb2312 の文字は変換されており、失われることはありません。 utf8 は世界中のすべての文字に対応できるため、データベースでは通常 utf8 エンコーディングが使用されます。これにより、任意の文字を UTF8 でエンコードされたデータベースに保存できるようになります。

e.phpmyadmin の文字化け問題 phpmyadmin は複数の言語をサポートしているため、HTML ページで utf8 エンコーディングを使用する必要があります。 HTML ページは utf8 エンコーディングを使用するため、phpmyadmin は、mysql に接続するときに、character_set_client およびcharacter_set_results に utf8 エンコーディングを使用する必要があります。 現在の状況では、PHP は、MySQL に接続するときに、セット名 (または他のいくつかのステートメント) を使用して MySQL にエンコード方法を通知することしかできません。明示的なエンコード方法が宣言されていない場合は、latin1 エンコードが使用されます。一般的なプログラムでは、character_set_client 変数を明示的に宣言しないため、gb2312 テキストは latin1 エンコーディングでデータベースに保存され、phpmyadmin はそれを utf8 形式で読み取るため、確実に文字化けします。 PHP プログラムが正しいエンコーディングでデータベースに保存されていれば、間違いなく問題はありません。したがって、変更する必要があるのは phpmyadmin ではありません (phpmyadmin を変更すると文字化けの問題が解決する場合もありますが、これは問題の根本ではありません)。

2つ。まとめ

1. データベースに utf8 ストレージを使用してみます (/etc/my.cnf を変更し、default-character-set=utf8 を [mysqld] セクションに追加します)。 (既存のデータベース、まず utf8 形式に変換します) 2. データベースにクエリを実行する前に、PHP プログラムは mysql_query("set names xxxx"); を実行します。ここで、xxxx は Web ページのエンコーディング (charset=xxxx)、Web ページで charset=utf8 の場合は xxxx=utf8 です。 Web ページの charset=gb2312 、次に xxxx=gb2312、Web ページの charset=ipaddr の場合、xxxx=ipaddr (冗談です。そのようなエンコーディングはありません) ほとんどすべての Web プログラムには、データベースに接続するための共通コードがあり、このファイルに mysql_query (「set names」) を追加するだけです。 3.phpmyadmin を変更する必要はありません。 4. Web ページの実際のエンコード (Windows の保存ダイアログ ボックスのエンコード) が宣言されたエンコード (charset=?) と一致していることを確認するには、dw などのツールを使用して Web ページを作成してください。



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。