ホームページ  >  記事  >  バックエンド開発  >  PHP の中国語の文字化けに関するいくつかの問題は注目に値します。

PHP の中国語の文字化けに関するいくつかの問題は注目に値します。

巴扎黑
巴扎黑オリジナル
2016-11-24 10:54:21890ブラウズ

PHP 中国語の文字化けは、PHP 開発でよくある問題の 1 つです。

PHP 中国語の文字化けは、Web ページ自体で発生することもあれば、MySQL の対話プロセスで発生することもあり、オペレーティング システムに関連していることもあります。ここに概要を示します。

1. 1 つ目は、PHP Web ページのエンコーディングです

最良かつ最速の解決策は、ページに適用されたページ番号がデータベースの内部エンコーディングと一致しない場合、ページによって宣言されたエンコーディングがデータベースの内部エンコーディングと一致することです。データベース、接続エンコーディングを設定します。mysql_query("SET NAMES KKK "); KKK は、文字化けの問題を確実に解決します。

1.ページは 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 [mysql] のデフォルト文字には utf8 エンコーディングを使用するのが最善です。 -set=utf8 [mysqld]default-character-set=utf8default-storage-engine=MyISAM [mysqld] の下に追加します:default-collat​​ion=utf8_bin init_connect='SET NAMES utf8'

2. PHP の前に mysql_query(" を追加します)データベース操作を実行する必要があるプログラム。set names 'encoding'");、エンコーディングは PHP エンコーディングと一致します。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("Pragma: public"); header("Expires: 0"); header("Cache-Component: must-revalidate, post-check=0, pre-check=0") ; header( "Content-type: $file_type"); header("Content-Disposition:attachment; filename="$file_name"");エンコーディング: binary "); 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 を使用しています。データベース接続エンコーディング: データベース操作を実行するときに、どのエンコーディングを使用する必要があるかを示します。たとえば、MySQL の内部デフォルト エンコーディングは latin1 エンコーディングです。これは、Mysql に送信されるデータは latin1 エンコーディングに変換されることを意味します。 latin1 エンコーディング。エンコーディングに関しては、文字化けの原因はわかっています。さまざまなエンコーディングのほとんどは ASCII と互換性があるため、文字化けの原因はわかります。



5. 一般的なエラー状況と解決策の決定:



1. データベースは UTF8 エンコーディングを使用しており、ページ宣言エンコーディングは GB2312 です。データが文字化けする最も一般的な原因は、データが PHP スクリプトで直接 SELECT されることです。クエリを実行する前に、mysql_query("SET NAMES GBK"); を使用して、次のことを確認する必要があります。ページが UTF- の場合、ページ宣言のエンコーディングは、ここで設定された接続エンコーディングと一致します (GBK は GB2312 の拡張です)。8 エンコーディングには、mysql_query("SET NAMES UTF8"); が使用できることに注意してください。ページで宣言されたエンコーディングがデータベースの内部エンコーディングと一致している場合、接続エンコーディングを設定する必要はありません。 注: 実際、MYSQL ではデータの入力と出力がより複雑になります。 MYSQL 設定ファイル my.ini には 2 つのデフォルトのエンコーディングが定義されています。つまり、[client] のデフォルト文字セットと [mysqld] のデフォルト文字セットです。デフォルトでは、上で指定したエンコーディングは、実際には 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 までご連絡ください。