PHPの中国語文字化け問題まとめ
PHP 中国語のコードが文字化けする これは、PHP 開発でよくある問題の 1 つです。
PHP 中国語コードが文字化けする はい Web ページ自体で発生する場合もあれば、MySQL の対話プロセスで発生する場合もあり、オペレーティング システムに関連する場合もあります。ここに概要を示します。
1. 1 つ目は、PHP Web ページのエンコーディングです
最良かつ最速の解決策は、ページによって宣言されたコーディングをデータベースの内部コーディングと一致させることです。ページによって要求されたページ番号がデータベースの内部コーディングと一致しない場合は、接続を設定します。コーディング。 ,mysql_query("SET NAMES XXX "); XXX は、文字化けの問題を確実に解決します。
1. php ファイル自体のエンコーディングと Web ページのエンコーディングは一致している必要があります。 gb2312 エンコードを使用する場合、PHP はヘッダーを出力する必要があります。 header(“Content-Type: text/html; charset=gb2312")、、すべてのファイルのエンコード形式は ANSI です。メモ帳で開き、名前を付けて保存し、エンコードを ANSI として選択して、ソース ファイルを上書きします。 utf-8 エンコーディングを使用したい場合、php はヘッダーを出力する必要があります。 header(“Content-Type: text/html; charset=utf-8")、 の場合、すべてのファイルのエンコード形式は utf-8 です。utf-8 で保存するのは少し面倒かもしれません。通常、utf-8 ファイルの先頭には BOM が付いています。 セッションに問題がある場合は、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] デフォルト文字セット = utf8 [mysqld] デフォルト文字セット = utf8 default-storage-engine=MyISAM [mysqld] の下に追加します:default-collation=utf8_bin init_connect='名前を設定 utf8'
2. データベース操作を実行する必要がある PHP プログラムの前に mysql_query("set names" を追加します) 'Encoding'");、エンコーディングは PHP エンコーディングと一致します。PHP エンコーディングが gb2312 の場合、mysql エンコーディングは gb2312 です。utf-8 の場合、mysql エンコーディングは次のようになります。 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("プラグマ: パブリック"); header("有効期限: 0"); must-revalidate, post-check=0, pre-check=0"); header("Content-type: $file_type"); header("Content-Length: $file_size"); header("Content-Disposition: Attachment; filename="$file_name"); header("コンテンツ転送エンコーディング: バイナリ"); readfile($file_path); $file_type はファイルの種類、$file_name は元の名前、$file_path はサービス上に保存されたファイルのアドレスです。
?4. コードが文字化けする原因をまとめてみましょう 一般的に、文字化けが発生する原因は 2 つあります。1 つはエンコード (文字セット) によるものです。 設定エラーにより、ブラウザーが間違ったエンコードで解析し、画面が乱雑な「Books from Heaven」で表示されました。次に、ファイルが間違ったエンコードで開かれ、最初は GB2312 で保存されました。 エンコードされており、UTF-8 エンコードで開いて保存します。上記の文字化けコードの問題を解決するには、まず開発のどの側面にコーディングが含まれるかを知る必要があります。
?
1. ファイルエンコーディング: ページファイル (.html、.php など) 自体が保存されるエンコーディングを指します。メモ帳とドリームウィーバー ファイルのエンコードはページを開いたときに自動的に認識されるので問題ありません。ただし、ZendStudio はエンコーディングを自動的には認識しません。環境設定の構成に基づいて、特定のエンコーディングでファイルを開くだけです。 作業中に間違ったエンコードでファイルを開いてしまい、修正後保存した瞬間に文字化けが発生してしまいました(これは私もよく知っています)。
?
2. ページ宣言のエンコーディング: HTML コード HEAD では、 Web ページに使用されているエンコーディングをブラウザに伝えるため、XXX は現在、中国の Web サイト開発で主に GB2312 と UTF-8 を使用しています。 3. データベース接続エンコーディング: データベース操作を実行するときにデータベースにデータを送信するために使用されるエンコーディングを指します。たとえば、データベース自体のデフォルトのエンコーディングと混同しないように注意してください。は 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"); これは、一般的に使用される UTF-8 ではなく UTF8 であることに注意してください。ページ宣言のエンコーディングがデータベースの内部エンコーディングと一致している場合は、接続エンコーディングを設定する必要はありません。 注: 実際、MYSQL のデータ入出力は、上記で説明したものよりも複雑です。MYSQL 設定ファイル my.ini には 2 つのデフォルトのエンコーディングが定義されており、これらは [client] のデフォルトです。 -[mysqld]のcharacter-setとdefault-character-set クライアント接続と内部データベースにそれぞれデフォルトで使用されるエンコーディングを設定します。上記で指定したエンコーディングは、実際には、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.cnblogs.com/showker/archive/2010/08/30/1812673.html