Javaの文字化け

Java は内部の文字コードに Unicode を使用している。だから、classファイルはどこでも動く、めでたしめでたし。・・・とはならないらしい。
Javaを使っていて発生する文字化け問題と、対応について簡単に書いてみた。
なお、書いてある内容は Java2以降について有効である。

ソースは何で?

日本にいるからには、ソースも日本語で書きたい。コメントや、文字列リテラルなど。
Windowsを使っていると、何も考えずに Shift JIS で書いて、コンパイルして、実行できている。これは、コンパイラが System Property の file.encoding に従ってソースを解釈してコンパイルしてくれるし、実行には標準入出力を file.encoding に従って解釈してくれるからだ。
では、UNIX環境で(別にどこの環境でも良いけど)EUCで書かれたソースをコンパイルするにはどうするか?javac -encodig EUC_JP とかする。
プログラムの入出力の文字コードを変えるのは、Reader, Writer の使い方の基本的なことだから、ここではわざわざ書かないことにする。

tomcatのパラメータ

Servletやjspを動かそうと思って、jakarta-tomcat をそのままインストールすると、HttpServletRequest#getParameter()で日本語のパラメータが取れなかったりする。(文字化けする)
これは、ブラウザがそれぞれのエンコーディング(たいていは、formが存在するページの文字コードと同じ)で文字列を送ってきたものを、tomcatがUnicodeにするときに ISO-8859-1 として解釈してしまうため。
new String(text.getBytes("iso-8859-1"), "Shift_JIS");
などのようにしてやると元の文字列を取り出すことができる。Shift_JIS の部分は、ブラウザが送ってくる文字コード。SJISでページを出していて、クライアントが Windows なら Shift_JIS で良い。汎用サイトを構築するには、getBytes("iso-8859-1") したものから自動判別する必要がある。しかし、EUC_JP と Shift_JIS を完全に識別することはできないので、どちらかを選ぶことになる。たいていの場合は JISAutoDetect で良いのでは?
new String(text.getBytes("iso-8859-1"), "JISAutoDetect");
※ と思ったら、以下のURLには可能な限り JISAutoDetectは使わないようにと書いてあります。

参考URL: http://www.ingrid.org/java/jserv/i18n/corruptedchar.html

MS932とSJIS

なんか、このページは webアプリの開発ではまる文字関係について書こうと思ったのだが、ほとんどは参考URLの風間さんのページで解決してしまう。ここに書いてあるいいかげんな情報よりも、参考URLの方を見ることをお勧めする(笑)。
さて、気を取り直して、webアプリと Oracle を使っていると、〜などの文字が?になったりする。これは、UnicodeといわゆるSJISのコンバータが複数あるためである。
(うっ、挫けた・・・、続きはまた気が向いたときに・・・)

参考URL: http://www.ingrid.org/java/i18n/encoding/ja-conv.html


false@wizard-limit.net