PHP 中国語の文字化けは、PHP開発においてよくある問題の一つです。 PHP の中国語の文字化けは、Web ページ自体で発生することもあれば、MySQL の対話プロセスで発生することもあり、オペレーティング システムに関連していることもあります。ここに概要を示します。
1. 1つ目はPHP Webページのエンコーディングです
1. PHPファイル自体のエンコーディングとWebページのエンコーディングが一致している必要があります
a. gb2312 エンコードを使用する場合、php はヘッダーを出力する必要があります: header("Content-Type: text/html; charset=gb2312")、、すべてのファイルのエンコード形式は ANSI なので、メモ帳で開き、名前を付けて保存し、エンコードを ANSI として選択して、ソース ファイルを上書きできます。
b. utf-8 エンコードを使用する場合、php はヘッダーを出力する必要があります: header("Content-Type: text/html; charset=utf-8")、」と入力すると、すべてのファイルのエンコード形式は utf-8 になります。 utf-8 として保存するのは少し面倒かもしれません。セッションを使用する場合は、editplus を使用して保存できます。パラメータの選択 -> ファイル -> UTF-8 署名で、「常に削除」を選択し、BOM 情報を削除します。
2. PHP 自体は Unicode ではないため、substr などのすべての関数を mb_substr に変更する必要があります (mbstring 拡張機能をインストールする必要があります)。または、iconv を使用してトランスコードできます。
2. PHP と Mysql の間のデータ対話
PHPとデータベースのエンコーディングは一貫している必要があります
1. mysql 設定ファイル my.ini または my.cnf を変更します。mysql には utf8 エンコーディングを使用するのが最適です。
[mysql]default-character-set=utf8
[mysqld]
default-character-set=utf8
default-storage-engine=MyISAM
[mysqld] の下に追加します:
default-collation=utf8_bin
init_connect=' SET名前 utf8'
3つ。 PHP はオペレーティング システムに関連しています
WindowsとLinuxではエンコードが異なります。Windows環境でPHP関数を呼び出す際、パラメータがutf-8でエンコードされていると、以下のようなエラーが発生します。 move_uploaded_file()、filesize()、readfile() など。これらの関数は、アップロードおよびダウンロードの処理時によく使用されます。呼び出し時に次のような問題が発生する可能性があります。 以下のエラー:警告: move_uploaded_file()[function.move-uploaded-file]: ストリームを開けませんでした: ...の引数が無効です
警告: move_uploaded_file()[function.move-uploaded-file]: ...
で '' を '' に移動できません
警告: filesize() [function.filesize]: ... の ... の統計に失敗しました警告: readfile() [function.readfile]: ストリームを開けませんでした: ..
の引数が無効です
Linux 環境で gb2312 エンコーディングを使用する場合、これらのエラーは発生しませんが、保存されたファイル名が文字化けし、ファイルを読み取ることができなくなります。この場合、まずパラメーターをオペレーティング システムが認識するエンコーディングに変換することができます。 コード、エンコード変換には mb_convert_encoding (文字列、新しいエンコード、元のエンコード) または iconv (元のエンコード、新しいエンコード、文字列) を使用できるため、処理後に保存されるファイル名は 文字化けもせず、ファイルも正常に読み込め、中国語名のファイルもアップロード、ダウンロードできます。実際には、システムから完全に分離する、より良い解決策があります。そのため、システムのエンコーディングを考慮する必要はありません。文字と数字のみのシーケンスをファイル名として生成し、漢字を含む元の名前をファイル名として保存できます。 データベースでは、move_uploaded_file()を呼び出す際に、ファイル名を元の漢字名に変更するだけで問題ありません。ダウンロードを実装するコードは以下の通りです
header("プラグマ: public");
header("有効期限: 0");
header("キャッシュコンポーネント: 必須再検証、事後チェック=0、事前チェック=0");
header("コンテンツタイプ: $file_type");
header("コンテンツの長さ: $file_size");
header("Content-Disposition:attachment; filename="$file_name"");
header("コンテンツ転送エンコーディング: バイナリ");
readfile($file_path);
$file_type はファイルの種類、$file_name は元の名前、$file_path はサービス上に保存されたファイルのアドレスです。
4つ。コードが文字化けする原因をまとめてみましょう一般的に、文字化けが発生する原因は 2 つあります。1 つはエンコード (文字セット) によるものです。 設定エラーにより、ブラウザーが間違ったエンコードで解析し、画面が乱雑な「天国の本」でいっぱいになります。2 番目に、ファイルが間違ったエンコードで開かれ、その後保存された場合です。 GB2312 でエンコードされていますが、UTF-8 エンコードで開かれ、保存されます。上記の文字化けしたコードの問題を解決するには、まず開発のどの側面にコーディングが含まれるかを知る必要があります:
1. ファイルエンコーディング: ページファイル (.html、.php など) 自体が保存されるエンコーディングを指します。メモ帳とドリームウィーバー ファイルのエンコードはページを開いたときに自動的に認識されるので問題ありません。ただし、ZendStudio はエンコーディングを自動的には認識しません。環境設定の構成に基づいて、特定のエンコーディングでファイルを開くだけです。 作業中に間違ったエンコードでファイルを開いてしまい、修正後保存した瞬間に文字化けが発生してしまいました(これはよく知っています)。
2. ページ宣言のエンコーディング: HTML コード HEAD では、; Web ページに使用されているエンコーディングをブラウザに伝えるため、XXX は現在、中国の Web サイト開発で主に GB2312 と UTF-8 を使用しています。
3. データベース接続エンコーディング: データベース操作を実行するときにデータベースにデータを送信するために使用されるエンコーディングを指します。ここでは、MySQL の内部デフォルトなどのデータベース自体のエンコーディングと混同しないように注意してください。
これは latin1 エンコーディングです。つまり、Mysql はデータを latin1 エンコーディングで保存し、他のエンコーディングで Mysql に送信されたデータは latin1 エンコーディングに変換されます。
WEB 開発でコーディングがどこに関係するかがわかったので、コードが文字化けする原因もわかりました。上記の 3 つのコーディング設定が矛盾しているため、さまざまなコーディングのほとんどが ASCII と互換性があるため、英語の記号は表示されず、中国語の文字は表示されません。不運になるでしょう。
5つ。よくあるエラー状況とその解決策に対処します:
1. データベースは UTF8 エンコーディングを使用し、ページ宣言のエンコーディングは GB2312 です。
, 文字化けの最も一般的な原因です。このとき、PHP スクリプト内の直接 SELECT データは文字化けします。クエリを実行する前にこれを使用する必要があります: mysql_query("SET.
NAMES GBK"); MYSQL 接続エンコーディングを設定し、ページ宣言エンコーディングがここで設定された接続エンコーディングと一致していることを確認します (GBK は GB2312 の拡張です)
)。ページが UTF-8 でエンコードされている場合は、 mysql_query("SET NAMES UTF8"); を使用できます。
これは UTF8 であり、一般的に使用される UTF-8 ではないことに注意してください。ページ宣言のエンコーディングがデータベースの内部エンコーディングと一致している場合は、接続エンコーディングを設定する必要はありません。
注: 実際、MYSQL のデータ入出力は、上記で説明したものよりも複雑です。[client] にある MYSQL 設定ファイル my.ini で定義されているデフォルトのエンコーディングが 2 つあります。 [mysqld] のデフォルト文字セットとデフォルト文字セット クライアント接続と内部データベースにそれぞれデフォルトで使用されるエンコーディングを設定します。上記で指定したエンコーディングは、実際には、MYSQL クライアントがサーバーに接続するときのコマンド ライン パラメータです。 Character_set_client は、デフォルトのエンコーディングを使用する代わりに、受信したクライアント データのエンコーディングを MYSQL サーバーに伝えます。
2. ページ宣言のエンコーディングがファイル自体のエンコーディングと一致しない場合、エンコーディングが一致しない場合、ページの作成時にアーティストがブラウザに表示する内容が文字化けしてしまうため、これはめったに起こりません。多くの場合、公開後に変更されます。 いくつかの軽微なバグは、間違ったエンコーディングでページを開いて保存することによって発生します。または、CuteFTP などの一部の FTP ソフトウェアを使用してオンラインでファイルを直接変更すると、ソフトウェアのエンコード設定が間違っているため、間違ったエンコードが変換されます。 コード。
3. バーチャルホストをレンタルしている一部の友人は、上記の 3 つのエンコーディングが正しく設定されているにもかかわらず、依然としてコードが文字化けしています。たとえば、Web ページは GB2312 です。 エンコードされている場合、IE およびその他のブラウザーは開くと常に UTF-8 として認識します。ページの HEAD には GB2312 と記載されています。ブラウザーのエンコードを手動で GB2312 に変更します。 次のページは正常に表示されます。その理由は、サーバー Apache がサーバーのグローバルなデフォルト エンコーディングを設定し、httpd.conf に AddDefaultCharset を追加するためです。 UTF-8 。このとき、サーバーは最初に HTTP ヘッダーをブラウザーに送信しますが、その優先順位はページ内で宣言されたエンコーディングよりも高くなります。当然、ブラウザーはそれを誤って認識します。解決策は 2 つあり、管理者はこれを自分の仮想マシンの構成ファイルに追加する必要があります。 AddDefaultCharset GB2312 を使用してグローバル構成をオーバーライドするか、独自のディレクトリの .htaccess で構成します。
要約: 一言で言えば、PHP で中国語の文字化けコードを解決する最善かつ最速の方法は、ページに適用されたページ番号がデータベースの内部コーディングと一致しない場合、ページによって宣言されたコーディングを作成することです。データベースの内部コーディング , mysql_query("SET NAMES XXX "); XXX が接続エンコーディングを設定するだけで、文字化けの問題は確実に解決されます。
http://www.bkjia.com/PHPjc/1048771.html