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

PHPの中国語文字化けの解決策

WBOY
WBOYオリジナル
2016-07-25 09:03:51949ブラウズ
  1. [mysql]
  2. default-character-set=utf8
  3. [mysqld]
  4. default-character-set=utf8
  5. default-storage-engine=MyISAM
  6. [mysqld] の下に追加します:
  7. default-collat​​ion=utf8_bin
  8. init_connect='SET NAMES utf8'
コードをコピーします

2. データベース操作を実行する必要がある PHP プログラムの前に、エンコーディングが PHP エンコーディングと一致するように追加します。 PHPのエンコードがgb2312、mysqlのエンコードがgb2312の場合はutf-8なので、データの挿入時や取得時に文字化けが発生しません

3. PHP はオペレーティングシステムに関連しています Windows と Linux のエンコードは異なります。Windows 環境では、move_uploaded_file()、filesize()、readfile() などの PHP 関数を呼び出すときにパラメータが UTF-8 エンコードされているとエラーが発生します。これらの関数は処理中です。 Uploads. はダウンロード時によく使用されますが、呼び出し時に次のエラーが発生する場合があります。 警告: 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() を呼び出すときに問題は発生しません。ファイル名を中国語の文字を含む元の名前に変更します。ダウンロードを実装するコードは次のとおりです

  1. header(”プラグマ: public”);
  2. header(”有効期限: 0”);
  3. header(”キャッシュコンポーネント: 必須再検証、事後チェック = 0、事前チェック = 0”) ;
  4. header("Content-type: $file_type");
  5. header("Content-Length: $file_size");
  6. header("Content-Disposition:attachment; filename="$file_name"");
  7. header(" Content-Transfer-Encoding: binary”);
  8. readfile($file_path);
コードをコピー

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

4.文字化けするのはなぜですか? 一般的に、文字化けが発生する原因は 2 つあります。まず、エンコード (文字セット) 設定のエラーが原因で、ブラウザが間違ったエンコードで解析し、乱雑な「天国の本」が表示されます。次に、ファイルを開いて間違ったエンコードで保存しています。たとえば、テキスト ファイルは元々 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 と互換性があるため、英語の記号は表示されず、中国語の文字は表示されません。運。 。

5. よくあるエラーの状況と解決策 1. データベースは UTF8 エンコーディングを使用しており、ページ宣言のエンコーディングは GB2312 です。これが文字化けの最も一般的な原因です。このとき、PHP スクリプト内の直接 SELECT データは文字化けします。クエリを実行する前に mysql_query("SET NAMES GBK"); を使用して、MYSQL 接続エンコーディングを設定し、ページ宣言エンコーディングが接続と一致していることを確認する必要があります。ここでエンコードを設定します (GBK は GB2312 の拡張子です)。ページが UTF-8 でエンコードされている場合は、mysql_query("SET NAMES UTF8"); を使用できます。 一般的に使用される UTF-8 ではなく、UTF8 であることに注意してください。ページ宣言のエンコーディングがデータベースの内部エンコーディングと一致している場合は、接続エンコーディングを設定する必要はありません。 注: 実際、MYSQL のデータ入出力は、上で説明したものよりも複雑です。MYSQL 構成ファイル my.ini には 2 つのデフォルトのエンコーディングが定義されています。 [mysqld]. -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 の中国語コードの文字化けを解決する最善かつ最速の方法は、ページによって要求されたページ番号がデータベースの内部エンコーディングと一致しない場合、ページで宣言されたエンコーディングがデータベースの内部エンコーディングと一致していることを要求することです。データベース、接続エンコーディングを設定します、mysql_query("SET NAMES XXX "); XXX は接続エンコーディングであり、文字化けの問題を確実に解決できます。



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