JSPで動いているWebアプリケーションで、普段は普通にHTMLで表を表示するのだけど、その表をCSVでも取得できるようにしてそのままExcelで読み込ませたい、という要件がありました。
そのため、HTMLはUTF-8で表示するが、CSVはShift_JISで出力させる必要が出ました。
JSPでShift_JISでの表示を行う場合、自分はPerlでcgi書くときと同じで、UTF-8の文字列をShift_JISに変換し、それをcontentTypeも合わせてShift_JISを指定してやる必要があるのだと考えていました。
なので
byte[] sjis = str.getBytes("Shift_JIS");
とかやってShift_JISのバイト列を得て、それを表示させようとしていたのですが、どうしてもコード列っぽいのしかでない… となっていました。
が、実はJSPだとcontentTypeの指定を変更してやると、その指定に合わせて出力文字コードを自動的に変換してくれるのですね。
<%@ page contentType="text/csv; charset=Shift_JIS" %>
とページディレクティブで指定するか、動的に指定したい場合には
response.setContentType("text/csv; charset=Shift_JIS");
とresponseで指定してやります。
わかってしまえばすごくシンプルで簡単なんだけど、他の言語の知識で「変換が必要」と思い込んでるとハマる、というお話でした。
(追記)
ファイルとしてダウンロードさせたい場合には、contentTypeの指定を「text/csv」ではなく「application/octet-stream」にしておくと、ファイルダウンロードのダイアログが出てくる。