タイトルWebObjects 5で日本語を表示する方法(続き)カテゴリーWebObjects
作成日2001/5/28 18:59:34作成者新居雅行
後は、ビルドして実行するだけだ。ビルドや実行の方法は、CocoaやCarbonアプリケーションのときと同様、Project Builderの左上のボタンを使うことで可能である。トンカチのアイコンでビルドを行い、ディスプレイのアイコンで実行を行う。Project Builderのコンソール領域に赤い文字でなにやらいっぱい出てくるが、しばらく待つと、Internet Explorerが起動して作成したページが見えるようになる。この段階では、ページに記述した日本語の文字列が文字化けしているのを確認できるはずだ。WebObjects 4.5もいくつかの手当をしないと日本語が処理できなかったが、はたして、WebObjects 5ではどうなっているのだろうか。(ちなみに、Main.javaの変更をしたとき、いったんプロジェクトの生成結果をクリアしないと、ビルドしたアプリケーションに変更結果が反映されないという症状に出くわしている。筆者の環境に依存するものか不具合かは不明だが、同じような症状の方は、いったんクリアしてビルドしてみよう。)

□ビルドした結果をWebブラウザから参照したが文字化けしている
 
□テキストフィールドに「あいう123」と入力してSubmitボタンをクリック
 

いずれにしても文字化けしているが、ここでテキストフィールドに文字列を入力してSubmitボタンをクリックすると、Main.javaのdoActionが呼び出される。このとき、WebObjectsのコンポーネントの機能により、インスタンス変数のtext1はテキストフィールドに入力された値が代入しているはずだ。そして、文字コードを適当にダンプしているのだが、テキストフィールドに「あいう123」と入力してSubmitボタンをクリックした後に、Project Builderのコンソールには、次のように数値が出てくる。なお、右側の16進表示は、分かりやすいように表示結果に付け加えたものだ。

0:130 =82H
1:160 =A0H
2:130 =82H
3:162 =A2H
4:130 =82H
5:164 =A4H
6:49
7:50
8:51

結果を見て明白なように、Stringなのに中身はShift-JISエンコードされている。文字数も9文字と違っているのは、コードの2バイトが別々になっているのである。これでは、その後のJavaのプログラムでも支障を来す。
なお、WebObjectsのコンポーネントを使って変数text1の値をページ上に表示しているが、ここだけ文字列はきちんと表示されてしまっている。結果はきちんと表示されるが、要はShift-JISのままプロセスを流れていった結果、たまたまうまく表示されているものだと考えていいのではないかと思われる。

なお、このアプリケーションを起動したときに、MainというグループのWeb Componentsによるページが表示されるということは、Application.javaの中のプログラムで定義されている。

ここで、日本語を表示できるように、Application.javaに以下の2つのメソッドを追加してみる。これにより、表示するページの生成やあるいは受け取ったリクエストの文字エンコードを明確に定義することになる。

public void takeValuesFromRequest(WORequest aRequest, WOContext aContext){
aRequest.setDefaultFormValueEncoding("Shift_JIS");
aRequest.setFormValueEncodingDetectionEnabled(true);
super.takeValuesFromRequest(aRequest, aContext);
}

public void appendToResponse(WOResponse aResponse, WOContext aContext){
aResponse.setContentEncoding("Shift_JIS");
super.appendToResponse(aResponse, aContext);
// aResponse.setHeader("text/html; charset=Shift_JIS", "Content-Type");
}

では、再度ビルドして実行してみよう。以下のように、問題なく日本語が表示できるようになった。なお、上記のappendToResponseメソッドにある最後のコメント化されているステートメントは、HTTPヘッダに指定するエンコードの記述を追加するものだ。規格上は必要なヘッダ情報だが、これは無くても日本語は表示できるようだ。

□生成するページで日本語が表示できるようになった
 
□テキストフィールドに「あいう123」と入力してSubmitボタンをクリック
 

やはり、□テキストフィールドに「あいう123」と入力してSubmitボタンをクリックしてみた。そのときのProject Builderに表示された結果は以下の通りだ。今度は、テキストフィールドに入力された結果が問題なくUNICODEと認識しているのが分かる。文字数も問題ない。

0:12354 =3042H
1:12356 =3044H
2:12358 =3046H
3:49
4:50
5:51

WebObject 4.5でも同様なメソッドの追加を行っていたが、エンコードの種類を指定するのに数字を使っていた。しかしながら、WebObjects 5では、エンコードの指定を、文字列で行う。Javaの標準的なエンコード指定方式に従ったものだと思われる。なお、それ以外にとりあえずは変更しなくても、日本語の表示はできるようになったということだ。

実際のWebObjectsアプリケーションではデータベースの接続もともなうのであるが、今回はデータベース接続は行わない状況での実験を報告した。データベース利用を行うとすると、WebObjectsアプリケーションからアダプタを介してJDBCドライバを利用する。階層の上ではここまではとにかく文字列はUNICODEで一定ということになる。WebブラウザとアプリケーションのやりとりはShift-JISなのだが、おそらく、前記のプログラムのようにリクエストとレスポンスに文字コードの記述を加えるだけで、アプリケーションのプログラムの中では、UNICODEで統一して扱われると考えて良さそうだ。結果的に、データベースで日本語が利用できるかどうかは、JDBCドライバがきちんと日本語で動作することや、そのJDBCの動作に合わせてデータベースエンジンが日本語をきちんとハンドリングするかどうかということに結果的に集約されることになる。つまり、責任という意味では、WebObjects外のソフトウエアに依存されるわけだ。結果的にデータベースの提供側から、どのバージョンのJDBCドライバを使い、どんな文字エンコードをデータベースエンジンで設定するのかといった情報が与えられる必要があることも言えるだろう。
関連リンクプラネットコンピュータ