ホームページ >バックエンド開発 >PHPチュートリアル >PHP_PHPチュートリアルの中国語文字化け問題の完璧な解決策
1. 1つ目はPHP Webページのエンコードです
1.phpファイル自体のエンコードとWebページのエンコードが一致している必要があります
a. gb2312 エンコーディングを使用したい場合、php は header: 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 に変更するか (mbstring 拡張機能をインストールする必要があります)、iconv トランスコーディングを使用する必要があります。
2. PHPとMysql間のデータ対話
PHPとデータベースのコーディングは一貫している必要があります
1. mysql 設定ファイル my.ini または my.cnf を変更します。mysql には utf8 エンコーディングを使用するのが最適です。
[mysql]デフォルト文字セット=utf8
[mysqld]
デフォルト文字セット=utf8
default-storage-engine=MyISAM
[mysqld] の下に追加します:
default-collation=utf8_bin
init_connect=UTF8 の名前を設定します
2. データベース操作を実行する必要がある PHP プログラムの前に mysql_query("set names programming"); を追加します。PHP エンコーディングが gb2312 の場合、mysql エンコーディングは gb2312 です。 utf-8 の場合、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]: stat failed for ... in ...
警告: readfile() [function.readfile]: ストリームを開けませんでした: ..
の引数が無効です
Linux 環境で gb2312 エンコーディングを使用する場合、これらのエラーは発生しませんが、保存されたファイル名が文字化けし、ファイルを読み取ることができなくなります。この場合、まずパラメーターをオペレーティング システムで認識されるエンコーディングに変換できます。エンコード変換には、mb_convert_encoding (文字列、新しいエンコード、元のエンコード) または iconv (元のエンコード、新しいエンコード、文字列) を使用できます。これにより、処理後に保存されたファイル名が文字化けせず、ファイルを正常に読み込むことができます。中国語名のファイルのアップロードとダウンロード。実際、より良い解決策があります。それはシステムから完全に分離することであり、システムのエンコーディングを考慮する必要はありません。ファイル名として文字と数字のみのシーケンスを生成し、データベースに漢字を含む元の名前を保存することができます。この方法では、ダウンロード時に move_uploaded_file() を呼び出すときに問題は発生しません。ファイル名を中国語の文字を含む元の名前に変更します。ダウンロードを実装するコードは以下の通りです
header("プラグマ: public");
header("有効期限: 0");
header("キャッシュコンポーネント: 必須再検証、事後チェック=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はサービス上に保存されたファイルのアドレスです。