ホームページ  >  記事  >  バックエンド開発  >  PHPの中国語文字化けの一般的な解決策のまとめ

PHPの中国語文字化けの一般的な解決策のまとめ

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

PHP の中国語文字化けのよくある解決策のまとめ

PHP の中国語文字化けは、PHP 開発においてよくある問題の 1 つです。 PHP の中国語の文字化けは、Web ページ自体で発生することもあれば、MySQL の対話プロセスで発生することもあり、オペレーティング システムに関連していることもあります。ここに概要を示します。

1. 1 つ目は、PHP Web ページのエンコーディングです。

1 を使用する場合は、php ファイル自体のエンコーディングと Web ページのエンコーディングが一致している必要があります。 gb2312 エンコードの場合、php はヘッダーを出力する必要があります: header( "Content-Type: text/html; charset=gb2312"), add 静的ページに移動し、すべてのファイルのエンコード形式が 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
in [mysqld] 以下を追加します:
default-collat​​ion=utf8_bin
init_connect='SET NAMES utf8'

2. PHP の前に mysql_query("set names 'encoding'") を追加します。データベース操作を実行する必要があるプログラム、エンコーディングは PHP エンコーディングと一致します。PHP エンコーディングが gb2312 の場合、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("Pragma: public");

header("Expires: 0");

header("Cache-コンポーネント: 再検証する必要があります、事後チェック = 0、事前チェック = 0");

header("Content-type: $file_type");

header("Content-Length : $file_size" );

header("Content-Disposition:attachment; filename="$file_name"");

header("Content-Transfer-Encoding:binary");

readfile($file_path);

$file_type はファイルの種類、$file_name は元の名前、$file_path はサービスに保存されたファイルのアドレスです。

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

文字化けが発生する原因は大きく分けて 2 つあります。 1 つ目は、エンコード (文字セット) の設定が正しくないため、ブラウザが2 つ目は、ファイルが間違ったエンコードで開かれ、その後保存された場合です。たとえば、テキスト ファイルは元々 GB2312 でエンコードされていましたが、開かれました。 UTF-8エンコーディングで保存してください。上記の文字化けコードの問題を解決するには、まず開発のどの側面にコーディングが含まれるかを知る必要があります。

1. ファイルエンコーディング: ページファイル (.html、.php など) 自体が保存されるエンコーディングを指します。 Notepad と Dreamweaver では、ページを開くときにファイルのエンコーディングが自動的に認識されるため、問題は少なくなります。ただし、ZendStudio はエンコーディングを自動的に認識しません。作業中に誤って間違ったエンコーディングでファイルを開き、変更を行った後にファイルを保存すると、文字化けしてしまいます。の文字が出てきます(しみじみ)。

2. ページ宣言のエンコーディング: HTML コード HEAD では、 を使用して伝えることができます。ブラウザ サーバー Web ページにはどのようなエンコーディングが使用されますか? 現在、XXX は中国の Web サイト開発で主に GB2312 と UTF-8 を使用しています。

3. データベース接続エンコーディング: データベース操作を実行するときに使用されるエンコーディングを指します。データベースからデータを送信するときは、データベース自体のエンコーディングと混同しないように注意する必要があります。たとえば、MySQL 内のデフォルトのエンコーディングは latin1 エンコーディングです。つまり、Mysql は Mysql に送信されるデータを latin1 エンコーディングで保存します。他のエンコーディングは latin1 に変換されます。
WEB 開発にエンコーディングが関係していることを知ると、文字化けの原因もわかります。さまざまなエンコーディングのほとんどが ASCII 互換であるためです。 、英語の記号は表示されません。

5. いくつかの一般的なエラー状況と解決策に対処します。

1 データベースは UTF8 エンコーディングを使用します。現時点では、PHP スクリプトの直接 SELECT から出力されるデータが文字化けする最も一般的な原因です。mysql_query("SET NAMES GBK") を使用する必要があります。 ; ページがエンコードを宣言するように MYSQL 接続エンコードを設定します (GBK は GB2312 の拡張です)。mysql_query(") SET NAMES UTF8");
一般的に使用される UTF-8 ではなく、UTF8 であることに注意してください。ページで宣言されたエンコーディングがデータベースの内部エンコーディングと一致している場合は、接続エンコーディングを設定する必要はありません。

注: 実際、MYSQL のデータ入出力は、MYSQL 構成ファイル my.ini で定義されているように、上記よりも複雑です。 [client] と [mysqld] のdefault-character-set は、クライアント接続とデータベースが内部的に使用するエンコーディングをそれぞれ設定します。エンコーディングは実際には、MYSQL クライアントがサーバーに接続するときにコマンド ライン パラメータcharacter_set_client に指示します。 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 までご連絡ください。