ホームページ >バックエンド開発 >PHPチュートリアル >PHP開発でよくある中国語の文字化けに対処する方法_PHPチュートリアル
PHP や MySQL の開発中に偶然中国語の文字化けが発生します。これはデータベースのエンコーディングとファイルのエンコーディングの問題です。以下に PHP の中国語の文字化けの解決策を多数まとめました。
PHP 中国語の文字化けは、Web ページ自体で発生することもあれば、MySQL との対話中に発生することもあり、オペレーティング システムに関連していることもあります。ここに概要を示します。
1. 1つ目はPHP Webページのエンコーディングです
最良かつ最速の解決策は、ページによって宣言されたコードがデータベースの内部コードと一致していることを確認することです。ページによって要求されたページ番号がデータベースの内部コードと一致しない場合は、接続コードを設定します。
コードをコピー | |
1. php ファイル自体のエンコーディングと Web ページのエンコーディングは一致する必要があります。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 と Mysql の間のデータ対話
PHPとデータベースのエンコーディングは一貫している必要があります
1. mysql 設定ファイル my.ini または my.cnf を変更します。mysql には utf8 エンコーディングを使用するのが最適です。
コードは次のとおりです
[mysql] デフォルト文字セット=utf8 [mysqld] デフォルト文字セット=utf8 デフォルトストレージエンジン=MyISAM | |||||||||||||||||||||
コードは次のとおりです | コードをコピー |
default-collation=utf8_bin init_connect='SET NAMES utf8' |
2. データベース操作を実行する必要がある PHP プログラムの前に mysql_query("set names 'encoding'"); を追加します。PHP エンコーディングが gb2312 の場合、mysql エンコーディングは gb2312 です。 utf-8 の場合、mysql エンコーディングは utf8 なので、データの挿入または取得時に文字化けが発生しません
3. PHP はオペレーティング システムに関係しており、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("コンテンツ転送エンコーディング: バイナリ");
$file_type はファイルの種類、$file_name は元の名前、$file_path はサービス上に保存されたファイルのアドレスです。
| 1. ファイルエンコーディング: ページファイル (.html、.php など) 自体が保存されるエンコーディングを指します。 Notepad と Dreamweaver では、ページを開くときにファイルのエンコーディングが自動的に認識されるため、問題は少なくなります。ただし、ZendStudio はエンコーディングを自動的に認識しません。作業中に誤って間違ったエンコーディングでファイルを開き、変更を行った後にファイルを保存すると、文字化けしてしまいます。の文字が出てきます(しみじみ)。
2. ページ宣言のエンコーディング: HTML コードの HEAD では、
を使用できます。
コードは次のとおりです
コードをコピー
現在、中国の Web サイト開発では、XXX は主に GB2312 と UTF-8 を使用して、Web ページに使用されているエンコーディングをブラウザーに通知します。 3. データベース接続エンコーディング: データベース操作を実行するときにデータベースにデータを送信するために使用されるエンコーディングを指します。たとえば、MySQL 内のデフォルトのエンコーディングと混同しないように注意してください。 latin1 は、Mysql が latin1 エンコーディングを使用してデータを保存することを意味し、他のエンコーディングで Mysql に送信されたデータは latin1 エンコーディングに変換されます。 WEB 開発のどこにコーディングが関係しているかを知ると、コードが文字化けする原因もわかります。上記の 3 つのコーディング設定が矛盾しているため、さまざまなコーディングのほとんどが ASCII と互換性があるため、英語の記号は表示されず、中国語の文字は表示されません。 。
5つ目。よくあるエラー状況と解決策をいくつか取り上げます:
1. データベースは UTF8 エンコーディングを使用しており、ページ宣言のエンコーディングは GB2312 です。これは文字化けの最も一般的な原因です。現時点では、PHP スクリプト内の直接 SELECT データが文字化けするため、クエリの前に使用する必要があります:
2. ページ宣言のエンコーディングがファイル自体のエンコーディングと一致しない場合、エンコーディングが一致しない場合、ページの作成時にアーティストがブラウザに表示する内容が文字化けしてしまうため、これはめったに起こりません。多くの場合、リリース後にいくつかの軽微なバグを修正し、間違ったエンコーディングでページを開いて保存することが原因で発生します。または、CuteFTP などの一部の FTP ソフトウェアを使用してオンラインでファイルを直接変更すると、ソフトウェアのエンコード設定が間違っているため、間違ったエンコードが変換されます。 3. バーチャルホストをレンタルしている友人の中には、上記の 3 つのエンコーディングが正しく設定されているにもかかわらず、依然としてコードが文字化けしている人がいます。たとえば、Web ページが GB2312 でエンコードされている場合、ブラウザのエンコードを手動で GB2312 に変更すると、Web ページの HEAD はすでに GB2312 として認識されます。 、ページは正常に表示されます。その理由は、サーバー Apache がサーバーのグローバルなデフォルト エンコーディングを設定し、httpd.conf に AddDefaultCharset UTF-8 を追加するためです。このとき、サーバーは最初に HTTP ヘッダーをブラウザーに送信しますが、その優先順位はページ内で宣言されたエンコーディングよりも高くなります。当然、ブラウザーはそれを誤って認識します。解決策は 2 つあります。管理者は構成ファイル内の独自の仮想マシンに AddDefaultCharset GB2312 を追加してグローバル構成をオーバーライドするか、独自のディレクトリの .htaccess で構成する必要があります。 要約: 一言で言えば、PHP での中国語の文字化けの問題を解決する最善かつ最速の方法は、ページに適用されているページ番号がデータベースの内部エンコーディングと一致しない場合、ページで宣言されているエンコーディングをデータベースの内部エンコーディングと一致させることです。データベースの内部エンコーディング、接続エンコーディングを設定します。 コードは次のとおりです
|