« 07.11 jsファイルをキャッシュさせない | ココ | 07.13 雲を掴む感じなリンク »

2006年7月12日

JSPと文字コードの狭間で  このエントリーを含むはてなブックマーク 

先週から引き続いているJSPの勉強ですが…

旅費精算システムでのProjectコード入力部分の作成に取り掛かり始めた。あっさり終わるのかと思いきや、これがまた難題続きやった…予定時間よりもかなりかかってしまった。
JSPのページ(A+B)から、JavaScriptを使って(要はAjaxで)他のJSP(C)にアクセスして、Projectコードの一覧を保存しているファイルを読み込んで、そのうちの一部を戻り値として、JSP(A)に表示する…という単純なAjaxインターフェースを実現しようとしたわけやけども。

簡単にコードを書けばこんな(ref. 第3回 基本的なAjaxアプリケーションを作成してみよう(中編))感じになるんやけどね…


絵で描けばこんなシステム。

頭の中では簡単にできると想像ができてたのに…文字がちゃんと表示されない。また文字コードか!! と文字コードと格闘することに…。

IEのステータスバー左下にエクスクラメーションアイコンが表示されている。エラーが起こってるけどエラー内容が意味不明。さっぱり分からん。よくよく調べてみたところ、『システムエラー:-1072896658』がxmlhttp.responseTextを踏んだ途端に発生していることが判明。xmlhttp.getResponseHeader('Content-Type')とかは全然何事も起こらないのに、responseTextだけ、エラーが起こる。
検索したところ、人力検索はてなが出てきた。

text/plain; charset=shift_jis ...?

他にも調べてみたら、

なんてものがあった。Utf-8に変える必要があるのか…? Shift_JISか…?

JSP(C)のコードに<%@ page contentType="text/plain; charset=shift_jis" %> とかresponse.setHeader("content-Type", "text/plain; charset=shift_jis"); とか試しにやってみるも、なぜかうまく行かず…なんでや、なんでや、とJSP(A)とかJSP(B)の文字コードの設定とかいろいろいじってみた結果、なぜかふとした拍子にうまく行った。結局、utf-8に文字コードをそろえなくてもshift_jisでできた。

JSP(A)の文字コード…
<%@ page contentType="text/html; charset=Windows-31J" pageEncoding="Windows-31J" %>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-31J" />

JSP(B)の文字コード…
<%@ page contentType="text/javascript" pageEncoding="Windows-31J" %>
response.setHeader("content-Type", "text/javascript");

JSP(C)の文字コード…
<%@ page contentType="text/plain; charset=shift_jis" pageEncoding="Windows-31J" %>
response.setHeader("content-Type", "text/plain; charset=shift_jis");

データファイルの文字コード…shift_jis(ANSI)

これで、JSP(C)でString.indexOf(String key)で一致する箇所があるテキストだけを拾ってきて、それを返すようにしたんだが…日本語で検索できない。という次なる難題が発生。なんでやねん! と。

JSP(B)で、渡すキーワードをencodeURIでエスケープするのを忘れてた、とかいうことが原因なのかと思ったら、そうではないらしい。日本語を入力すると"???"と3文字の?が出てくるから…UTF? と思ったけど、これを解決する方法にたどり着くまでにまた数十分とかかる。

JSPでパラメータを取得するときに日本語を使ってたら、
request.setCharacterEncoding("Windows-31J");
request.getParameter("some_param");
てな感じでエンコードを設定する(ref. Javaの文字化け対策FAQ(3))んやけれども、文字コードの組み合わせをいろいろと変えてたときに混乱してしまってて、setCharacterEncoding()を外してた。その結果、encodeURI()をしててもパラメータを取得したときに間違ったエンコード(多分latin?)がされるらしい。
request.setCharacterEncoding("utf-8");
にしたら、無事、日本語のキーワードもちゃんと日本語(Shift_JIS)にエンコードされて検索してくれた。JSP(A)もJSP(B)もShift_JISやのに、XMLHTTPRequestを通したときにUnicodeに書き換えられるらしい。
(※送信はPOSTで行う必要がある…Operaで使えないやん(T_T; )

次は、一覧表示されたProjectコードにリンクを張って、テキストフィールドを書き換えるときに起こった更なる問題について。

By ただ at 22:41 カテゴリー ; mein Erbe , 仕事関係

« 07.11 jsファイルをキャッシュさせない | 07月の記事 | 07.13 雲を掴む感じなリンク »




トラックバック

このエントリーのトラックバックURL:
http://pinmarch.sakura.ne.jp/mt/mt-tb.cgi/568