ホームページ  >  記事  >  php教程  >  PHPにおける中国語文字化けの解決策のまとめと分析

PHPにおける中国語文字化けの解決策のまとめと分析

WBOY
WBOYオリジナル
2016-06-13 12:22:06772ブラウズ

1. 1 つ目は、PHP Web ページのエンコーディングです
1。gb2312 エンコーディングを使用する場合は、php ファイル自体のエンコーディングと Web ページのエンコーディングが一致している必要があります。ヘッダーを出力します: header(“Content-Type: text /html; charset=gb2312″)、すべてのファイルのエンコード形式は ANSI であり、メモ帳で開き、ソース ファイルを上書きして、名前を付けて保存し、エンコードを選択できます。
b. utf-8 エンコードを使用する場合、php はヘッダーを出力する必要があります: header(“Content-Type: text/html; charset=utf-8”)、
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]: stat が失敗しました… in …
警告: readfile() [function.readfile]: ストリームを開けませんでした: .. の引数が無効です。
これらのエラーは、Linux 環境で gb2312 エンコーディングを使用する場合には発生しませんが、保存後のファイル名はこの場合、まずオペレーティング システムが認識するエンコードに変換することができます。 mb_convert_encoding (文字列、新しいエンコード、元のエンコード) を使用できます。または iconv (元のエンコード、新しいエンコード、文字列) を保存すると、保存されたファイル名は文字化けせず、正常に読み込むことができ、中国語名のファイルのアップロードとダウンロードが可能になります。
実際には、より良い解決策があります。それは、システムから完全に切断することです。そのため、システムのエンコードを考慮する必要はありません。ファイル名として文字と数字のみのシーケンスを生成し、データベースに漢字を含む元の名前を保存することができます。この方法では、ダウンロード時に move_uploaded_file() を呼び出すときに問題は発生しません。ファイル名を中国語の文字を含む元の名前に変更します。ダウンロードを実装するコードは次のとおりです。
header(”Pragma: public”)
header(”Expires: 0″); 0、pre -check=0″);
header(”Content-type: $file_type”);
header(”Content-Length: $file_size”); Attachment; filename =”$file_name”);
header(”Content-Transfer-Encoding: binary”);
readfile($file_path); $file_type はファイルのタイプです。元の名前、$file_path はサービスに保存されたファイルのアドレスです。

4.文字化けが発生する原因をまとめてみましょう

文字化けが発生する原因は大きく分けて 2 つあります。 1 つ目は、エンコード (文字セット) の設定が間違っているため、ブラウザが間違ったエンコードで解析してしまうことです。 2 つ目は、ファイルが間違ったエンコードで開かれて保存された場合です。たとえば、テキスト ファイルは元々 GB2312 でエンコードされていたのに、UTF-8 エンコードで開かれて保存されました。上記の文字化けしたコードの問題を解決するには、まず開発のどの側面にエンコーディングが関係しているかを知る必要があります。
1. ファイル エンコーディング: ページ ファイル (.html、.php など) 自体が保存されるエンコーディングを指します。 。 Notepad と Dreamweaver では、ページを開くときにファイルのエンコーディングが自動的に認識されるため、問題は少なくなります。ただし、ZendStudio はエンコーディングを自動的に認識しません。作業中に誤って間違ったエンコーディングでファイルを開き、変更を行った後にファイルを保存すると、文字化けしてしまいます。の文字が出てきます(しみじみ)。
2. ページ宣言のエンコーディング: HTML コード HEAD で、 3. データベース接続エンコーディング: データベース操作を実行するときにデータベースにデータを送信するために使用されるエンコーディングを指します。これは、データベース自体のエンコーディングと混同しないように注意する必要があります。たとえば、MySQL の内部デフォルト エンコーディングは latin1 エンコーディングであり、Mysql に送信されたデータは他のエンコーディングで変換されることを意味します。
WEB 開発にエンコーディングが関係していることを理解すると、コードが文字化けする理由もわかります。さまざまなエンコーディングのほとんどは ASCII、英語の記号と互換性があるためです。
5. いくつかの一般的なエラー状況と解決策に対処します。
1. データベースは UTF8 エンコーディングを使用し、ページ宣言エンコーディングは GB2312 です。現時点で文字化けの最も一般的な原因は、PHP スクリプト内の直接 SELECT データが文字化けしていることです。mysql_query("SET NAMES GBK"); を使用して MYSQL 接続エンコーディングを設定し、ページ宣言のエンコードは、ここで設定した接続エンコードと一致します (GBK は GB2312 拡張子です)。ページが UTF-8 でエンコードされている場合は、mysql_query("SET NAMES UTF8"); ではなく UTF8 であることに注意してください。ページで宣言されたエンコーディングがデータベースの内部エンコーディングと一致している場合、
注: 実際には、MYSQL のデータ入力と出力は、 MYSQL 設定ファイル my.ini には 2 つのデフォルトのエンコーディングが定義されており、[client] のデフォルトと [mysqld] のデフォルトの文字セットはそれぞれ使用されるエンコーディングを設定します。上記で指定したエンコーディングは、実際には、MYSQL クライアントがサーバーに接続するときに、クライアント データがデフォルトのエンコーディングを使用する代わりに使用されるエンコーディングを MYSQL サーバーに伝えるためのコマンド ライン パラメータです。
2. ページ宣言のエンコーディングがファイル自体のエンコーディングと一致しない場合、ほとんどの場合、ブラウザに表示されるページは文字化けしてしまうため、これはまれに発生します。これは、公開後にいくつかの小さなバグを修正し、間違ったエンコーディングでページを開いて保存することが原因で発生します。または、CuteFTP などの一部の FTP ソフトウェアを使用してオンラインでファイルを直接変更すると、ソフトウェアのエンコード設定が間違っているため、間違ったエンコードが変換されます。
3. バーチャルホストをレンタルしている一部の友人は、上記の 3 つのエンコードが正しく設定されているにもかかわらず、依然としてコードが文字化けしています。たとえば、Web ページが GB2312 でエンコードされている場合、ブラウザのエンコードを手動で GB2312 に変更すると、Web ページの HEAD はすでに GB2312 として認識されます。 、ページは正常に表示されます。その理由は、サーバー Apache がサーバーのグローバルなデフォルト エンコーディングを設定し、httpd.conf に AddDefaultCharset UTF-8 を追加するためです。このとき、サーバーは最初に HTTP ヘッダーをブラウザーに送信しますが、その優先順位はページ内で宣言されたエンコーディングよりも高くなります。当然、ブラウザーはそれを誤って認識します。解決策は 2 つあります。管理者は、AddDefaultCharset GB2312 を独自の仮想マシンの構成ファイルに追加してグローバル構成をオーバーライドするか、独自のディレクトリの .htaccess で構成する必要があります。

要約: 一言で言えば、PHP で中国語の文字化けコードを解決する最善かつ最速の方法は、ページ番号が適用されている場合に、ページによって宣言されたコーディングをデータベースの内部コーディングと一致させることです。ページはデータベースの内部コーディングと矛盾しています。set 接続コードを設定します。mysql_query("SET NAMES XXX"); これで文字化けの問題は確実に解決されます。

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