【調査】文字化け対策(エンコーディング指定)
サイトが文字化けするんですが。。。
エンコーディング指定が効いていないようなんですが。。。
等々の問題ってよくあるので、
文字化け対策について整理してみました。
4つのポイントを押さえておけばOK。
①エンコーディング指定の有効順
http://www.atmarkit.co.jp/fjava/rensai3/mojibake01/mojibake01.html
下記の順で有効になること
1.HTTPヘッダのエンコーディング指定
-JSPの場合:pageディレクティブで文字コードを指定する
-サーブレットの場合:HttpServletResponse.setContentTypeメソッドで文字コードを指定する
2.HTMLヘッダのエンコーディング指定
-metaタグで指定
②metaタグ記述上の注意点
http://www.shtml.jp/mojibake/meta.html
HTMLヘッダのエンコーディング指定は
文字(きっと日本語)が表示される前に書くこと
-metaタグの前にtitleタグを書くと、
うまく認識できない(場合がある)
感覚的にはブラウザがよろしくやってくれる場合もある
③標準名(iana)と別名の区別、Windows-31JとShift_JISの区別
http://1024x768.blog74.fc2.com/blog-entry-27.html
Windows-31JはShift_JISの拡張。
Windows-31JのエイリアスはMS932。
Shift_JISのエイリアスはSJIS。
※JDK1.4_1βにてエイリアスの変更があった。
④charsetとpageEncodingの違い
http://www.oracle.co.jp/forum/thread.jspa?threadID=9000850
1.pageEncodingは、JSPコンパイラにエンコーディングを教える
2.charsetは、ブラウザにエンコーディングを教える
1.のJSPコンパイラにエンコーディングを教えるというのは、JSPは
JSP -> JSPコンパイル -> JSPServlet -> Javaコンパイル -> class
という順序を自動でコンパイルしてくれるのですが、このJSPコンパイラに
pageEncoding属性で文字コードを教えます。
例)<%@ page pageEncoding="shift_jis" %>
なので、charsetのみの指定だとpageEncodingがiso-8859-01のままで
文字化けした。などのパターンが良くあります。
2.のcharsetはコンパイラに対して指定するのではなく、あくまでも
ブラウザがどのように対応するか?のようなHTMLのMeta属性のような役割
になります。