PHP プログラミングにおける中国語エンコーディングの問題は、この問題に対処した経験のない多くの人を悩ませることがよくあります。実際、この問題の理由は、それぞれの国 (または地域) がコンピューター情報の文字エンコーディング セットを規定しているからです。米国の拡張ASCIIコード、中国のGB2312-80、日本のJISなど。この国・地域における情報処理の基盤として、文字コードセットはエンコードを統一する上で重要な役割を果たしています。文字エンコード セットは、長さに応じて、SBCS (シングルバイト文字セット) と DBCS (ダブルバイト文字セット) の 2 つのカテゴリに分類されます。初期のソフトウェア (特にオペレーティング システム) では、ローカル文字情報のコンピューター処理を解決するために、差別化を図るために、LANG やコードページなどの概念が導入されました。ただし、さまざまなローカル文字セットのコード範囲が重複しているため、相互に情報を交換するのは困難であり、ソフトウェアの各ローカライズ バージョンを個別にメンテナンスするコストは高くなります。そのため、ローカライズ作業の共通点を抽出して一貫して処理し、特殊なローカライズ処理内容を最小限に抑える必要があります。これは国際化 (118N) とも呼ばれます。各種言語情報はさらにロケール情報として標準化されます。処理される基礎となる文字セットは Unicode になり、これにはほぼすべてのグリフが含まれます。
現在、国際化機能を備えたソフトウェアのコア文字処理のほとんどは Unicode に基づいており、ソフトウェアの実行時に、対応するローカル文字エンコーディング設定は、その時点のロケール/言語/コードページ設定とローカル文字に基づいて決定されます。それに応じて処理されます。処理中に、Unicode とローカル文字セットの間、または Unicode を中間として使用する 2 つの異なるローカル文字セットの間で変換する必要があります。この方法はネットワーク環境でもさらに拡張され、ネットワークの両端にある文字情報も文字セット設定に従って許容可能なコンテンツに変換する必要があります。
データベースのキャラクタ セット エンコーディングの問題
一般的なリレーショナル データベース システムはすべて、データベース キャラクタ セット エンコーディングをサポートしています。つまり、データベースの作成時に独自のキャラクタ セット設定を指定でき、データベース データは指定されたエンコーディングで保存されます。 。アプリケーションがデータにアクセスするとき、入口点と出口点で文字セット エンコード変換が行われます。中国語データの場合、データベースの文字エンコード設定によりデータの整合性が保証される必要があります。 GB2312、GBK、UTF-8 などはすべてオプションのデータベース文字セット エンコーディングです。もちろん ISO8859-1 (8 ビット) を選択することもできますが、プログラムでデータを書き込む前に 16 ビットの中国語文字を変換する必要があります。または、Unicode を 2 つの 8 ビット文字に分割し、データを読み取った後、2 つのバイトを結合して SBCS 文字を識別する必要があるため、データベース キャラクタ セット エンコーディングとして ISO8859-1 を使用することはお勧めしません。これでは、データベース自体の文字セット エンコーディング サポートが最大限に活用されないだけでなく、プログラミングの複雑さも増大します。プログラミングを行う場合、まずデータベース管理システムが提供する管理機能を使用して、中国語データが正しいかどうかを確認できます。
データベースにクエリを実行する前に、PHP プログラムはまず mysql_query("SET NAMES xxxx"); を実行します。ここで、xxxx は Web ページのエンコーディング (charset=xxxx) の場合、xxxx=utf8 です。 Web ページ gb2312 で charset= の場合、xxxx=gb2312 になります。ほとんどすべての WEB プログラムには、データベースに接続するための共通コードがあり、このファイルに mysql_query("SET NAMES xxxx") を追加するだけです。
SET NAMES クライアントから送信された SQL ステートメントで使用されている文字セットを示します。したがって、SET NAMES 'utf-8' ステートメントは、サーバーに「このクライアントからの将来のメッセージでは文字セット utf-8 が使用される」ことを伝えます。また、サーバーがクライアントに送り返す結果の文字セットも指定します (たとえば、SELECT ステートメントを使用する場合、列の値にどの文字セットが使用されるかを示します)。
問題を特定するときに一般的に使用されるテクニック中国語のエンコードの問題を特定するには、通常、最も愚かで最も効果的な方法が使用されます-疑わしいと思われるプログラムによる処理後の文字列の内部コードを出力します。文字列の内部コードを出力すると、いつ中国語の文字が Unicode に変換されるか、いつ Unicode が中国語の内部コードに再変換されるか、いつ 1 つの中国語の文字が 2 つの Unicode 文字になるか、いつ中国語の文字列が次の文字列に変換されるかを知ることができます。疑問符、いつ中国語の文字列の上位ビットが切り捨てられたのですか...
適切なサンプル文字列を入手することは、質問の種類を区別するのにも役立ちます。例: 「aaah aa?@aa」、および GB と GBK の両方の特徴文字を含むその他の中国語と英語の文字列。一般に、英語の文字は、どのように変換または処理しても歪みません (歪みが発生した場合は、連続する英語文字の長さを長くしてみてください)。
1
http://www.bkjia.com/PHPjc/446704.html
。