まずは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 に変更するか、iconv を使用してトランスコードする必要があります。
2つ。 PHP と Mysql の間のデータ対話
PHP とデータベースのチュートリアルのコーディングは一貫している必要があります
1. mysql チュートリアルの設定ファイル my.ini または my.cnf を変更します。mysql には utf8 エンコーディングを使用するのが最適です。
[mysql]デフォルト文字セット=utf82. データベース操作を実行する必要がある PHP プログラムの前に mysql_query("set names 'encoding'"); を追加します。PHP エンコーディングが gb2312 の場合、mysql エンコーディングは gb2312 です。 utf-8 の場合、mysql エンコーディングは utf8 なので、データの挿入または取得時に文字化けが発生しません
[mysqld]
デフォルト文字セット=utf8
デフォルトストレージエンジン=MyISAM
[mysqld] の下に追加します:
デフォルト照合=utf8_bin
init_connect='名前を設定 utf8'
3. PHPはオペレーティングシステムに関連しています
WindowsとLinuxではエンコーディングが異なります。 Windows環境では、move_uploaded_file()、filesize()、readful()などのUTF-8コーディングの場合、PHP関数を呼び出す際のパラメータが間違っています。処理中です。アップロード時やダウンロード時によく使用されます。
警告: 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 はサービスに保存されたファイルのアドレスです
php ファイルと静的 Web ページのエンコーディングは一貫している必要があります。
1. utf-8 エンコードを使用する場合、php ファイルはすべての出力の前に次の内容を追加します。
header("Content-Type: text/html; charset=utf-8");
静的ページが追加されました:
。
すべてのファイルのエンコード形式はutf-8です。 Windows に付属のメモ帳などのソフトウェアでは、UTF-8 で保存すると、目に見えない文字 (0xEF 0xBB 0xBF、つまり BOM - バイト オーダー マーク) が 3 つ挿入されます。これは、メモ帳などの編集者がファイルが UTF-8 でエンコードされているかどうかを識別できるようにするために使用される隠し文字の文字列です。通常のファイルの場合は問題ありません。
しかし、PHP の場合、PHP は設計時に BOM の問題を考慮していませんでした。UTF-8 でエンコードされたファイルの先頭にある BOM の 3 文字は無視されず、BOM を先頭のテキストの一部として使用します。ファイル。 または EmEditor を使用して保存できます。EmEditor で [名前を付けて保存] > [Unicode 署名 (BOM)] のチェックを外し、保存して BOM 情報を削除します。
2. gb2312 エンコーディングを使用すると、php ファイルの前に次の出力が追加されます。
header("Content-Type: text/html; charset=gb2312"),ページ追加しました
すべてのファイルのエンコード形式はANSIです。2つ。 PHP とデータベースのエンコーディングは一貫している必要があります
Mysql データベースを例に挙げると、データベース操作を実行する必要がある PHP プログラムの前に mysql_query("set names 'xx'"); を追加します。PHP エンコーディングが gb2312 の場合、xx は gb2312 です。 then xx は utf8 (utf-8 ではなく utf8 です) なので、データ操作時に文字化けが発生しません。
さらに、mysql には utf8 エンコーディングを使用し、mysql 設定ファイル my.ini または my.cnf を変更することが最善です
[mysql]デフォルト文字セット=utf8
[mysqld]の下に追加します:
[mysqld]
デフォルト文字セット=utf8
デフォルトストレージエンジン=MyISAM
デフォルト照合=utf8_bin
init_connect='名前を設定 utf8'
echoで出力した中国語が文字化けして表示されます
実際、さまざまなサーバー スクリプトでこの問題が発生するはずです
基本的にはエンコードの問題です
一般に、エンコーディングの互換性の理由から、ほとんどのページはページ文字セットを utf-8 として定義します
この時、中国語を正常に表示するには
などのエンコード方式を変換する必要があります。 echo iconv("GB2312","UTF-8",'中国語') は文字化けしません
などの他の方法もあります PHPのエコーの前にheader("Content-Type:text/html;charset=gb2312");
を追加します もちろん、簡体字中国語ページも簡単にできます
の UTF-8 を gb2312 に変更します
;
練習中に不思議な現象に遭遇しました
ローカルサーバーではページが正常に表示されているのに、サーバーにアップロードするとエコーが文字化けしてしまいます
この理由についてはよく考えていませんでしたが、位置を変更して iconv 関数 GB2312 および UTF-8 で再エンコードするのが正常なので、
しかし、これはおそらく APACHE が原因であり、より正確には PHP サーバーのさまざまな設定が原因であると考えられます
PHP.INI を見れば解決できるはずです
コードが文字化けする原因をまとめてみましょう
一般的に、文字化けが発生する原因は 2 つあります。1 つは、間違ったエンコード (文字セット) 設定により、ブラウザが間違ったエンコードで解析し、その結果、文字化けが発生する乱雑な「天国の本」が発生することです。次に、ファイルの読み取り時にエラーが発生します。たとえば、テキスト ファイルは元々 GB2312 でエンコードされていましたが、UTF-8 エンコードで開かれて保存されました。上記の文字化けしたコードの問題を解決するには、まず開発のどの側面にコーディングが含まれるかを知る必要があります:
1. ファイルエンコーディング: ページファイル (.html、.php など) 自体が保存されるエンコーディングを指します。 Notepad と Dreamweaver では、ページを開くときにファイルのエンコーディングが自動的に認識されるため、問題は少なくなります。ただし、ZendStudio はエンコーディングを自動的に認識しません。作業中に誤って間違ったエンコーディングでファイルを開き、変更を行った後にファイルを保存すると、文字化けしてしまいます。の文字が出てきます(しみじみ)。
2. ページ宣言のエンコーディング: HTML コード HEAD で、 を使用して、Web が何であるかをブラウザーに伝えることができます。現在、XXX は中国の Web サイト開発で主に GB2312 と UTF-8 を使用しています。
3. データベース接続エンコーディング: データベース操作を実行するときにデータベースにデータを送信するために使用されるエンコーディングを指します。たとえば、データベース自体のエンコーディングと混同しないように注意してください。 MySQL のエンコーディングは latin1 エンコーディングです。つまり、MySQL はデータの保存に latin1 エンコーディングに基づいており、他のエンコーディングで Mysql に送信されたデータは latin1 エンコーディングに変換されます。
WEB 開発のどこにコーディングが関係しているかを知ると、コードが文字化けする原因もわかります。上記の 3 つのコーディング設定が矛盾しているため、さまざまなコーディングのほとんどが ASCII と互換性があるため、英語の記号は表示されず、中国語の文字は表示されません。 。
<頭>
$mysql_server_name='localhost';
$mysql_username='root';
$mysql_password='000000';
$mysql_database='lib';
$conn=mysql_connect($mysql_server_name,$mysql_username,$mysql_password,$mysql_database);
$sql="mytb から名前、年齢を選択";
print($conn);
$rs=mysql_db_query("lib","select * from mytb",$conn);
print("
");
while($row = mysql_fetch_object($rs)){
print ($row->name.":".$row->age."
");
}
mysql_close($conn);
?>以下のように表示されます:
リソースID #1
dd:54
ddd:8
??:15
???:25
??:32
MySQLエンコーディング:utf8、GBKを試しました。 mysql フォントとコマンド ライン表示は両方とも正しいです。補足質問:
文字化けしたコード:
???:15
???:25
??:32
これらの行では、データベース内の値は漢字で表示されています。解決策:
$rs=mysql_db_query("lib","select * from mytb",$conn);
の前に
を追加しますmysql_query("set names gb2312"); または mysql_query("set names gbk");
五。よくあるエラー状況とその解決策をいくつか取り上げます:1. データベースは UTF8 エンコーディングを使用しており、ページ宣言のエンコーディングは GB2312 です。これは文字化けの最も一般的な原因です。このとき、PHP スクリプト内の直接 SELECT データは文字化けします。クエリを実行する前に mysql_query("SET NAMES GBK"); を使用して、ページ宣言のエンコーディングが接続と一致していることを確認する必要があります。ここでエンコーディングを設定します (GBK は GB2312 の拡張子です)。ページが UTF-8 でエンコードされている場合は、mysql_query("SET NAMES UTF8"); を使用できます。 一般的に使用される UTF-8 ではなく、UTF8 であることに注意してください。ページ宣言のエンコーディングがデータベースの内部エンコーディングと一致している場合は、接続エンコーディングを設定する必要はありません。
注: 実際、MYSQL のデータ入出力は、上記で説明したものよりも複雑です。MYSQL 設定ファイル my.ini には 2 つのデフォルトのエンコーディングが定義されています。これらは、[client] と [ のデフォルトの -character-set です。 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 で構成する必要があります。