- ベストアンサー
HTMLの文字化けについて
- クライアントPC(WindowsVista)で作成したHTMLファイルをサーバ(CentOS5.4)にアップして、ブラウザから確認してみたところ、文字化けを起こしてしまいました。
- ローマ字は問題ないのですが、日本語が文字化けしてしまっており、表示がめちゃくちゃになってしまっています。
- 文字化けの原因がお分かりになる方いらっしゃいましたら、ご教授のほどお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 まず、質問の意図として 1.ひとまず、文字化けを解消したい。 2.文字コードをSHIFT-JISで統一し、文字化けを解消したい。 3.文字コードをEUC-JPで統一し、文字化けを解消したい。 が考えられます。 #2さんがおっしゃられるように、出力する文字コードを指定しているのは、サーバーの設定かと思います。対して、html内で指定する文字コードは表示(ブラウザが解釈)する文字コードの指定と位置づけることができると思います。従って、html内の記述如何で出力文字コードを変更することはできませんが、出力文字コードとhtml内の指定が一致しないとしっかり文字化けを起こします。 本題として、ひとまず文字化けを解消したいのであれば、質問内容を見る限り、出力文字コードはEUC-JPなので、htmlフォーマットをEUC-JPに変更して、head内で同じくEUC-JPを指定すれば、EUC-JP統一として文字化けは解消されるはずです。EUC-JPが問題ないのであれば、もっとも単純な方法です。 対して、文字コードをSHIFT-JISに統一して文字化けを解消したいのであれば、html自体は変更せずに、サーバーの出力文字コードを変更することになります。内容は#2さんの方法そのままかと思います。最初の質問内容にあるように、シェルを利用出来る、あるいはhttpd.confを編集できるのであれば、同じようにコードをSHIFT-JISに変更し、それが難しいようであれば、.htaccessによる設定になるかと思います。 話はずれますが、なぜ、デフォルトのサーバー文字コードをUTF8からEUC-JPに変更し、HTML文書自体をSHIFT-JISにしたかは分かりませんが、静的なコンテンツを扱うだけなら、UTF8をおすすめします。何らかのCGIの都合でEUC-JPに変更しているのであれば、EUC-JPに統一するか、ディレクトリ毎に.htaccessで希望文字コードを指定することになると思います。どこまでサーバーの設定が許されているかわからないのでなんとも言えませんが。
その他の回答 (3)
- tracer
- ベストアンサー率41% (255/621)
> 静的なコンテンツを扱うだけなら、UTF8をおすすめします" と > ありますが、これはどういった理由からなのでしょうか? > お時間ございましたら、お手数お掛けしますが、ご回答のほどお願い致します。 一言で言ってしまえば、汎用性が高いということです。 静的コンテンツに限ったことではないのですが、UTF8は世界標準フォーマットですので、特に多言語対応のページを作ろうとしたときに、かなりの恩恵があります。多言語対応ページ作成の機会は少ないかもしれませんが、急な要件が出た場合に、対応できるかできないかは大きいと思います。前回の回答で「静的コンテンツ」と限定したのは、他者が作成したEUC-JPのCGIライブラリなどを使う可能性があったからです。ご自身で0からCGIを起こせるのであれば、動的コンテンツでもUTF8で問題ないと思います。 HTML、CSS、Javascript、PHP、DBは統一してUTF8を扱うことができます。そうすることは珍しいことではないですし、むしろスタンダードではないでしょうか。使用したいライブラリにもよりますが、著名なPHPライブラリはUTF8を蹴ることはほとんどないと思います。 UTF8に固執せずとも、DB、CGI、HTMLを統一した文字コードにすることによって、ほぼ文字化けからは開放されます。逆に文字コードが統一されていないシステムは、文字コード変換というリソースを余分に使いますし、その処理を作成するコストがかかります。 個人的には、どこかでダウンロードしたプログラムをそのまま使いたいといったことがない限り、文字コードを混在させる必要を感じません。
お礼
tracerさん 迅速なご対応、ご丁寧なご説明をありがとうございます。 お陰様で、UTF8にする利点につきまして理解することができました。今までCGIは利用したことがなかったのですが、便利なライブラリがたくさん利用できるようになっているので使用してみたいと思っておりました。 また、PHPに関してはまだ分かりませんがJavaScriptを扱う際にjQueryやprototype.jsなど色々なライブラリを使用したいと思っておりましたので、まだ何も作っていない今の状態からUTF8で統一して作成しておこうと思います。 ご教授のほど、ありがとうございました。
- saijyo_739
- ベストアンサー率53% (119/222)
HTTP応答ヘッダに書かれているコードと合っていますか。 Mozilla系のブラウザに、WebDevelopperやLive HTTP Headersを組み込み、それらで確認するのが手軽です。 ※ telnetで80番ポートに繋いで自分でHTTP要求ヘッダ送っても良いですが。 ※ ネットワークモニタ・パケットモニタ・スニッファなどと呼ばれるソフト使って確認する事もできますが。 HTTP応答ヘッダ(response headers)の一要素として Content-Type:text/html; charset=UTF-8 や Content-Type:text/html; charset=EUC-JP や Content-Type:text/html; charset=Shift_JIS といった形式で使っている文字セットが指定されているはずですので。 ※ ;以降(charset含む)はオプションで無指定の場合にはiso-8859-1(西欧の文字セット)が使われる事になるので英数字や西欧で使われている文字が表示されそうに思います。 > 初歩的なことであれなんですが、HTML自体に文字コードは指定していますか? 非常に初歩的な事ですが、それが使われるのは補助的でしかありません。 書く(保守する)方が目安にする程度のものです。 少なくとも通信で送られてきたコンテンツについては、ブラウザはHTTP応答ヘッダの方を優先する事になってます。 > <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" /> なぜ、http-equivという名前になっているのか考えましょ。本来はウェブサーバが送信するファイルを解析して付けるものですが、現状はそうなっていません。 サーバの設定を合わせてやる(ウェブサーバがcharset=Shift_JISオプション付きのContent-Typeヘッダを出力するよう設定してやる)必要があります。 プロバイダが標準はEUC-JPなのえEUC-JPで配置して/標準はUTF-8なのでUTF-8で配置してといっている場合にはそういう事です。 ※ CGIやPHPだと、コンテンツの中で指定(変更)できます。また、ウェブサーバの設定を変える事も可能( .htaccessやhttpd.conf等の変更)だと思います。手順はプロバイダが案内しているかと思います。
お礼
saijyo_739さん ご丁寧なご説明・ご回答どうもありがとうございます。 tracerさんのご回答と合わせて拝見させていただきました。 まず、サーバ側の文字コードの設定を # vi /etc/sysconfig/i18n LANG="ja_JP.UTF-8" でEUC-JPからUTF-8に変更しまして、また #vi /etc/httpd/conf/httpd.conf AddDefaultCharset shift_jis と設定した後に、当方のFFにアドオンでWebDevelopperを入れておりましたので、そちらから確認致しましたところ、 Content-Type:text/html; charset=Shift_JIS と表示されました。 この状態で、フォーマットをShift-JISにしたテンプレートをアップして確認してみたところ、文字化けせずに表示されました。 サーバ側の文字コードとテンプレートの文字コードを合わせてあげなければならないのですね。 問題が解決できてとても助かりました。また、勉強になりました。 どうもありがとうございます。
- tracer
- ベストアンサー率41% (255/621)
初歩的なことであれなんですが、HTML自体に文字コードは指定していますか? html4.0なのかhtml5なのか、xhtmlなのかはわかりませんが、documentスイッチやmetaタグやhtmlタグにで指定するあれです。
補足
tracerさん 早速のご回答、ありがとうございます。 また、説明が少なくご迷惑お掛けしまして申し訳ございません。 サーバにアップしたHTMLですが、 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" /> <title>タイトル</title> <meta name="description" content="説明文" /> <meta name="keywords" content="キーワード1,キーワード2,・・・" /> </head> <body> テスト </body> </html> となっておりまして、 charset=Shift_JIS で文字コードをShitf-JISに指定しております。 上記の内容のテンプレートをアップしてみても、文字化けを起こしてしまいます。試しに、テンプレートの文字コードをEUC-JPにして確認してみたところ、それでも文字化けを起こしてしまいました。 クライアントPCからは、ブラウザはIE8とFF3.6で確認しておりまして、文字コードがShift-JISの状態でブラウザの文字エンコーディングを日本語(Shift-JIS)に変更してページの再読み込みをしたところ、文字化けせず"テスト"と表示されました。 ブラウザのデフォルトで、文字エンコーディングがUnicode(UTF-8)となっているのでShift-JISのテンプレートを表示させた際に文字化けしてしまっているということなのでしょうか? だとしますと、他のホームページを閲覧した際に文字化けしないのが不思議なのですが・・・
お礼
先ほど”補足”にてご報告致しましたが、”お礼”でご報告するべきでした。 度々申し訳ございません。 どうもありがとうございました。
補足
tracerさん ご丁寧にご回答いただき、感謝しております。 今回の件につきまして、文字化けを解消することができましたことをまずご報告致します。 下記、ご回答致します。 >まず、質問の意図として 1.ひとまず、文字化けを解消したい。 2.文字コードをSHIFT-JISで統一し、文字化けを解消したい。 3.文字コードをEUC-JPで統一し、文字化けを解消したい。 HTMLのフォーマットを文字コード:Shift-JIS、改行コードをCRLFにして、文字化けを解消したいと思っておりましたので、上記では"2"にあたると思います。 >文字コードをSHIFT-JISに統一して文字化けを解消したいのであれば、html自体は変更せずに、サーバーの出力文字コードを変更することになります。 HTMLファイルはShift-JISにして、サーバの出力文字コードに関する設定の変更を行いました。変更を行った箇所としまして、 # vi /etc/sysconfig/i18n で LANG="ja_JP.UTF-8" とし、デフォルトのUTF-8に戻しました。また、 #vi /etc/httpd/conf/httpd.conf で AddDefaultCharset shift_jis としました(AddDefaultCharset off でも文字化けせずに表示されることを確認)ところ、 文字化けせずに表示することができました。 >なぜ、デフォルトのサーバー文字コードをUTF8からEUC-JPに変更し、HTML文書自体をSHIFT-JISにしたかは分かりませんが、静的なコンテンツを扱うだけなら、UTF8をおすすめします。 現在はまだHTMLファイルしか作っておりませんが、いずれphpとpostgreSQLを使用して動的なページを作成したいと考えております。そうなりますと、phpのフォーマットは文字コードを"EUC"、改行コードを"LF"として作成するかと思い、DBのテーブルの要素に日本語を入れることを考えるとCentOS側の文字コードをEUCにしておかなければTeraTermなどのターミナルからDBに接続した際に、格納してある日本語が文字化けて表示されるのかと思ったからです。 当方ホームページを作成することに対してあまり知識がないのですが、動的なホームページを作成する際には ・テンプレートはShift-JIS CRLF ・phpやその他プログラムファイルはEUC-JP LF で作成し、 ・DBの文字コードはEUC-JP かと思っておりました。 お陰様で解決することができ、とても助かりました。@ どうもありがとうございます。 ※"静的なコンテンツを扱うだけなら、UTF8をおすすめします" とありますが、これはどういった理由からなのでしょうか?お時間ございましたら、お手数お掛けしますが、ご回答のほどお願い致します。