ホームページ  >  記事  >  バックエンド開発  >  PHP ページで HTML が文字化けして表示されるのはなぜですか?

PHP ページで HTML が文字化けして表示されるのはなぜですか?

Guanhui
Guanhuiオリジナル
2020-05-14 15:18:403306ブラウズ

PHP ページで HTML が文字化けして表示されるのはなぜですか?

#HTML 文字化けしたコードが PHP ページに表示されるのはなぜですか?

#1. PHP Web ページのエンコード エラー;

gb2312 エンコードを使用する場合、PHP はヘッダー ("Content-Type: text/html; charset=gb2312") を出力し、それを静的ページに追加し、すべてのエンコード形式を設定する必要があります。ファイルは ANSI です。メモ帳で開き、選択したエンコーディングとして保存できます。ANSI の場合は、ソース ファイルを上書きします。

utf-8 エンコーディングを使用したい場合、php はヘッダー ("Content-Type: text/html; charset=utf-8") を出力し、静的ページとエンコーディングを追加する必要があります。すべてのファイルの形式は utf -8 です。 utf-8 で保存するのは少し面倒かもしれません。通常、utf-8 ファイルは先頭に BOM が付いています。セッションを使用すると問題が発生します。editplus を使用して保存できます。editplus で [ツール] -> [編集] に移動します。パラメータの選択 -> ファイル -> UTF-8 署名で、常に削除を選択し、保存して BOM 情報を削除します。

php 自体は Unicode ではないため、すべての substr およびその他の関数を mb_substr (mbstring 拡張機能をインストールする必要があります) に変更するか、iconv を使用してトランスコードする必要があります。

2. MySQL エンコーディングは PHP エンコーディングと一致しません;

解決策:

mysql 設定ファイル my.ini または my.cnf、mysql を変更します。最も使いやすい utf8 エンコーディング [mysql]default-character-set=utf8 [mysqld]default-character-set=utf8default-storage-engine=MyISAM [mysqld] の下に追加します:default-collat​​ion=utf8_bin init_connect='SET NAMES utf8'

データベース操作を実行する必要がある 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() などの関数は、アップロードやダウンロードの処理時によく使用されますが、呼び出し時に次のエラーが発生する場合があります:

Warning: move_uploaded_file()[function.move-uploaded-file]:failed to open stream: Invalid argument in ...
Warning: move_uploaded_file()[function.move-uploaded-file]:Unable to move '' to '' in ...
Warning: filesize() [function.filesize]: stat failed for ... in ...
Warning: readfile() [function.readfile]: failed to open stream: Invalid argument in ..

Linux 環境で gb2312 エンコーディングを使用していますがこれらのエラーは発生しませんが、保存したファイル名が文字化けし、ファイルを読み込むことができなくなります。この場合、まずオペレーティング システムが認識するエンコーディングにパラメータを変換することができます。エンコーディングの変換には、mb_convert_encoding (文字列) を使用できます。 、新しいエンコード、元のエンコード)またはiconv(元のエンコード、新しいエンコード、文字列)を使用すると、処理後に保存されたファイル名が文字化けせず、ファイルを正常に読み取ることができ、中国語名のファイルのアップロードとダウンロードを実現できます。

実際には、より良い解決策があります。それは、システムから完全に分離することです。これにより、システムのエンコーディングを考慮する必要がなくなります。ファイル名として文字と数字だけを並べたものを生成し、元の漢字を含むファイル名をデータベースに保存しておくと、move_uploaded_file()を呼び出す際に問題なくダウンロードできます。ファイル名を元の漢字名に変更します。 中国語名。ダウンロードを実装するコードは次のとおりです。


header("Pragma: public");
header("Expires: 0");
header("Cache-Component: 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("Content-Transfer-Encoding: binary");
readfile($file_path);

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

推奨チュートリアル: 「
PHP チュートリアル

以上がPHP ページで HTML が文字化けして表示されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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