IISのASPスクリプトと扱うデータを UTF-8 にする際の注意点メモ書き。
最近はUTF-8で多言語を扱うものが多くなってきた。MBCS(マルチバイトキャラクタセット)と比べ、各言語(コード)の処理を考慮しないでも良いのが利点。 さらに、今回はXMLを絡めており、XMLで値を受け表示することもやるのでUTF-8で全てを扱うのは必須となった。
Windowsのメモ帳であれば保存時にUTF-8が選択できる。
送信時に、キャラクタのエンコーディングをUTF-8である旨明示する。 例えば、HTMLのHEADタグ内部に
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
にしておけば、FORM等で扱うデータの文字コードセットはUTF-8になる。必ずそうなるかはブラウザによって違う可能性が大いにあるので、場合によってはFORMタグに明示的に文字コードセットの指定を行う必要がある。
wa01.asp - 文字を入力するためのフォーム表示ASPスクリプト
<%@LANGUAGE="JavaScript" %> <% Response.Charset = "utf-8"; Response.Expires = -1; Response.addHeader("Pragma","no-cache"); Response.addHeader("Cache-control","no-cache"); %> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=utf-8"> <TITLE>WA01</TITLE> </HEAD> <BODY> <H1><%= Request.ServerVariables("SERVER_SOFTWARE") %></H1> <FORM NAME="F1" METHOD="POST" ACTION="wa02.asp"> <INPUT TYPE="text" NAME="WA" VALUE=""> <INPUT TYPE="submit" VALUE="送る"> </FORM> </BODY> </HTML>
wa02.asp - wa01.aspから送られてきた文字の表示ASPスクリプト
<%@LANGUAGE="JavaScript" %> <% Response.Charset = "utf-8"; Response.Expires = -1; Response.addHeader("Pragma","no-cache"); Response.addHeader("Cache-control","no-cache"); %> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=utf-8"> <TITLE>WA02</TITLE> </HEAD> <BODY> <H1><%= Request.ServerVariables("SERVER_SOFTWARE") %></H1> [<%= Request.Form("WA") %>] </BODY> </HTML>
今回は上記2ファイルを、
の各サーバ上にコピーし、各サーバで稼動するIISで表示可能にしておく。
multipage.html - 各サーバのwa01.aspから送られてきた文字を表示するASPスクリプト
<HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=utf-8"> </HEAD> <BODY> <H1>Windows2000Server</H1> <IFRAME SRC="http://windows2000/wa01.asp"></IFRAME> <H1>WindowsXP</H1> <IFRAME SRC="http://windowsXP/wa01.asp"></IFRAME> <H1>WindowsServer2003</H1> <IFRAME SRC="http://windows2003/wa01.asp"></IFRAME> </BODY> </HTML>
これはデスクトップにおいて、一画面で3つのサーバの結果を見られるようにする。
ここで、各フレームにOSのIISのバージョンが表示され、テキストボックスが表示されます。 この状態でテキストボックスに「キタキツネ」と入力し、ボタンを押してみます。
Windows2000だと文字化けしてしまいました。
ASPスクリプトは基本的に OSのディフォルトの言語を使用します。 IIS5.1やIIS6.0は、ASPスクリプト自体がUTF-8で記述されていると、言語(コード)もUTF-8と解釈するようですが、 IIS5.0は、ASPスクリプトはUTF-8でも扱うデータはOSのディフォルトの言語を採用、としている感じです。 解釈の部妙な違いというか、半端に忠実というか、頭が固いというか…です。
余計な心配なくUTF-8を利用する場合には、OSのディフォルトより優先してUTF-8を使用する旨明示的に示しておきます。 具体的には、ASPスクリプトの @コマンドで コードページ65001を指定します。
参考(MSDN) リンク先が変わってフォローできません
<%@LANGUAGE="JavaScript" %> ↓ <%@LANGUAGE="JavaScript" CODEPAGE=65001 %>
とします。結果は、
この様に正しく文字が表示されます。