php web開発における文字化けし問題


一般的に、文字化けしの出現には2つの原因があり、まず符号化(charset)の設定が間違っているため、ブラウザが誤った符号化で解析し、画面がめちゃくちゃな「天書」が現れ、次いでファイルが誤った符号化で開かれ、その後保存され、例えばテキストファイルがGB 2312で符号化されていたのにUTF-8で符号化されて開いてから保存される.上記の文字化けし問題を解決するには、まず開発中にどのような一環が符号化に関連しているかを知る必要があります.
1、ファイルコード:ページファイル(.html,.phpなど)自体がどのようなコードで保存されているかを指す.メモ帳とDreamweaverは、ページを開くと自動的にファイルコードが認識されるので、あまり問題はありません.ZendStudioは自動的に符号化を認識することはなく、プリファレンスの構成に従って一定の符号化でファイルを開くだけで、仕事中に注意しないと、誤った符号化でファイルを開き、修正して保存すると、文字化けして現れます(私はよく知っています).
2、ページ申明符号化:HTMLコードHEADの中で、でブラウザのホームページにどんな符号化を採用したかを教えることができ、現在、中国語のウェブサイト開発でXXXは主にGB 2312とUTF-8の2種類の符号化を使用している.
3、データベース接続符号化:データベース操作を行う際にどの符号化でデータベースにデータを転送するかを指す.ここで注意しなければならないのは、データベース自体の符号化と混同しないことである.例えば、MySQL内部のデフォルトはlatin 1符号化である.つまり、Mysqlはlatin 1符号化でデータを格納し、他の符号化でMysqlに転送されたデータはlatin 1符号化に変換される.
WEB開発でどのような点が符号化に関連しているかを知ると、文字化けしの原因も分かる.上述の3つの符号化の設定が一致していない.各種符号化の大部分はASCIIと互換性があるため、英語記号が現れず、中国語が運が悪い.以下はよくある誤りと解決である.
1、データベースはUTF 8符号化を採用し、ページ申明符号化はGB 2312である.これは最もよく見られる文字化けしの原因である.この時PHPスクリプトの中で直接SELECTデータが出てくるのは文字化けしであり、検索前に先に使用する必要がある:
mysql_query("SET NAMES GBK"); 
でMYSQL接続符号化を設定し、ここで設定した接続符号化とページ申明符号化が一致することを保証する(GBKはGB 2312の拡張).ページがUTF-8符号化であれば、
mysql_query("SET NAMES UTF8"); 
一般的に使用されるUTF-8ではなくUTF 8であることに注意してください.ページに明記されている符号化がデータベース内の符号化と一致している場合は、接続符号化を設定しなくてもいいです.
注意:実際にはMYSQLのデータ入出力は上記より複雑ですが、MYSQLプロファイルmy.iniでは[client]のdefault-character-setと[mysqld]の2つのデフォルト符号化が定義されています.のdefault-character-setでは、デフォルト時のクライアント接続とデータベース内部で採用される符号化をそれぞれ設定します.上記で指定した符号化は、デフォルト符号化ではなく、MYSQLクライアントがサーバに接続する際のコマンドラインパラメータcharacter_set_clientで、MYSQLサーバが受信したクライアントデータがどのように符号化されているかを教えます.
2、ページ申明符号化とファイル自体の符号化が一致しない場合、このような状況はめったに発生しない.もし符号化が一致しない場合、美工がページを作る時にブラウザで見たのは文字化けしているからである.発表後にいくつかの小さなBUGを修正し、誤った符号化でページを開けて保存したことによるものである.あるいは、いくつかのFTPソフトウェアで直接オンラインでファイルを修正し、例えばCuteFTPである.ソフトのためデバイスの符号化構成が間違っているため、変換が符号化を間違えた.
3、一部の仮想ホストをレンタルしている友人は、上記の3つのコードが正しく設定されているのに文字化けしている.例えば、ウェブページはGB 2312コードで、IEなどのブラウザが開いているのにUTF-8と認識されている.ウェブページHEADにはGB 2312と明記されているが、手動でブラウザコードを変更してGB 2312にエンコードした後、ページが正常に表示される.発生原因はサーバーApacheがサーバー全体のデフォルト編を設定したことであるコード、httpd.confにAddDefaultCharset UTF-8が追加されています.このときサーバはまずHTTPヘッダをブラウザに送信します.その優先度はページに明記されているコードよりも高く、自然ブラウザで認識が間違っています.解決策は2つあります.管理者はプロファイル自体のダミーにAddDefaultCharset GB 2312を追加してグローバル構成を上書きしたり、自分のディレクトリの.htaccessで設定します.
2006.4.4後注:JunChenのお知らせに感謝します:この文は必ずXXXの前に書いてください.そうしないと、ページが空白になります(IE+PHPのみ).
以上は私の先日の仕事の中で問題に出会った総括と経験で、もし間違いがあれば、指摘を歓迎します!