« MySQL:TINYINT(1)の値 | トップページ | WebObjects:MySQLのためのEOModelの設定 »

WebObjects:日本語の基本

WebObjectsで開発を行うときの日本語に関する注意点です。開発環境はMac OS Xを想定しています。

開発環境における注意点
プロジェクトの保存場所
プロジェクトファイルを保存するフォルダはフルパスで日本語を含むフォルダには置かないようにします。
そうしないとWebObjectsBuilderやJavaコンパイラがファイルを開くことができません。
(/Usersの別名の「ユーザ」など,フォルダ名が別名表示のものはOK)

文字エンコーディングの設定
開発を始める前に開発環境の文字エンコーディングを揃えます。
ProjectBuilder及びXcodeの文字コードは,日本語環境では「日本語MacOS」(シフトJIS)がデフォルトですが,WebObjectsBuilderの初期値は英文系なので,この設定のまま使用するとWebObjectsBuilderが裏でJavaのソースを書き換えたときに,文字エンコーディングの不一致でソースコードに含まれる日本語が全滅してしまいます。
このようなことにならないために,事前にWebObjectsBuilderの文字エンコーディング設定(「Preferneces」→「General」→「Default Encoding」)をProjectBuilder/Xcodeの文字エンコーディング設定(「環境設定」→「テキスト編集」→「デフォルトのファイルエンコーディング」)に合わせておく必要があります。

ProjectBuilder/Xcodeのデフォルトエンコーディングは,新規コンポーネント及び新規ファイルで適用されます。
「新規プロジェクト」で作られたJavaソースファイル(ClassisグループのApplication.java,Session.java,DirectAction.javaと,WebComponentsグループ→MainのMain.java)の文字エンコーディングは,環境設定にかかわらず「Mac OS Roman」になっています。
この文字エンコーディングを変更してデフォルトの文字エンコーディングに揃えるには,ProjectBuilder/Xcodeで各ソースファイルを開き,「形式」メニュー→「ファイルエンコーディング」で文字エンコーディングを指定し,ダイアログで変換を指定して保存します。

また,既存のソースファイルをプロジェクトに追加して利用する場合も,利用するファイルの文字エンコーディングとデフォルトの文字エンコーディングを揃える必要があります。
これを揃える場合も,各ソースファイルを開いて「形式」メニュー→「ファイルエンコーディング」でデフォルトと同じ文字エンコーディングを指定して変換・保存します。

Xcodeでバックスラッシュを入力する
日本語入力に「ことえり」を使っていてキーボードがJISキーボードだった場合,英数モードで¥キーを押すとデフォルトで半角円記号が入力されますが,XcodeでUTF-8などUnicode系の文字コードのソースファイルを編集していた場合,半角円記号はバックスラッシュとは別文字です。そのため文字列中にバックスラッシュのつもりで円記号を入力していると,コンパイルエラーが起きたりプログラム実行時に思わぬ動作をすることがあります。
¥キーでバックスラッシュを入力するには,ことえりの「環境設定」→「入力文字」を開いて「JISキーボードの¥キーで入力する文字」のポップアップで「\(バックスラッシュ)」を選びます。

日本語のためのコーディング
WebアプリがHTMLで使用する文字コードの指定
WebObjectsで開発するWebアプリについて,各コンポーネントを表示したりテキストデータを入出力したりするときに日本語を使用する場合は,使用する日本語文字コードを指定する処理をソースコードに追加する必要があります。
ちなみに下記の例ではUTF-8を指定していますが,他の文字コードを指定することもできます(例:"Windows-31J","EUC-JP","ISO-2022-JP")。なお,ここで指定する文字コードは,サーバで稼動するWebアプリとクライアントのWebブラウザとの間でテキストをやりとりするときの文字コードであり,Webアプリの内部処理やデータベースで使用する文字コードとは無関係です。

注:シフトJISの文字エンコーディングは「Shift_JIS」ではなく「Windows-31J」を使いましょう。詳細はこちら

1)Application.javaのApplicationクラスに以下のメソッドを追加します。

// 各コンポーネントにおけるクライアントからのリクエストのデフォルト処理
public void takeValuesFromRequest(WORequest req, WOContext cont)
{
  req.setDefaultFormValueEncoding("UTF8");
  req.setFormValueEncodingDetectionEnabled(true);
  super.takeValuesFromRequest(req, cont);
}

// 各コンポーネントにおけるクライアントへのレスポンスのデフォルト処理
public void appendToResponse(WOResponse res, WOContext cont)
{
  res.setContentEncoding("UTF8");
  res.setHeader("text/html;charset=utf-8", "Content-Type");
  super.appendToResponse(res, cont);
}

2)Applicationクラスのコンストラクタに以下のコードを追加します。
WOMessage.setDefaultEncoding("UTF8");

3)コンポーネントのレスポンスにHTML表示以外のもの(CSVやPDFのダウンロードなど)がある場合,3-A)または3-B)どちらかの作業が必要です。(CSVレスポンスの具体的な実装例はこちら

3-A)コンポーネントクラスにappendToResponseメソッドを追加すると,追加したメソッドによりApplicationクラスのappendToResponseメソッドがオーバーライドされます。
コンポーネントクラスでappendToResponseメソッドをオーバーライドし,このメソッドにて
res.setHeader("text/html;charset=utf-8", "Content-Type");
の内容を,そのコンポーネントのレスポンスに合わせて適宜書き換えることで,HTML以外のレスポンスに対応します。

3-B)ApplicationクラスのappendToResponseメソッドから
res.setHeader("text/html;charset=utf-8", "Content-Type");
の行を削除すると,コンポーネントのレスポンスからContent-Typeの指定行が消えます。
この状態で,各コンポーネントのソースファイルの中から「コンポーネント名.html」ファイルを開き,<head>タグの中で,
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=utf-8">
を追加すると,この指定行がコンポーネントのレスポンスに追加されます。
この指定行の追加をすべてのコンポーネントで行った上で,この指定行の内容をコンポーネントごとに適宜書き換えることで,HTML以外のレスポンスに対応します。

テキストデータの改行コードをWeb画面上で改行させる
テキストデータをWebObjectsBuilder上でWOStringにバインドして表示させると,テキストデータに改行が含まれているにもかかわらず改行されずに表示されてしまいます。
これは,改行(CRLF)は無視して表示するHTMLの仕様によるものです。画面上で改行するには「<br>タグ」が必要です。WOStringでは記号のエスケープ処理は行いますが,改行の<br>タグへの変換は行わないので,この変換を行うコードが必要になります。WebObjectsのクラスライブラリを使って「改行→<br>タグ変換」を行うのは以下のようなコードになります。
String str = "あいうえお\r\nかきくけこ"; // 改行を含む文字列。
str = WOMessage.stringByEscapingHTMLAttributeValue(str);
NSArray array = NSArray.componentsSeparatedByString(str, "&#13;&#10;");
str = array.componentsJoinedByString("<br/>");
上記コードのうち「WOMessage.stringByEscapingHTMLAttributeValue」は,文字列に含まれる記号のうち,HTMLでエスケープが必要なものをエスケープします。
「NSArray.componentsSeparatedByString」は,第一引数の文字列(str)を第二引数の文字列(改行コード)で分割します。上記の例では改行コード(CRLF)を10進表記で指定しています。
「array.componentsJoinedByString」では,分割した文字列を,間に「<br/>」を挟んでつなげています。

以上のコードで得たstrをWOStringにバインドします。このときWOStringのアトリビュート「escapeHTML」はOFFに指定しておきます。

■関連情報
WebObjects:Web ブラウザの文字エンコードを設定する方法
Java:Shift_JISのエイリアスの変更について
Javaで指定できる文字エンコーディング[1.3][1.4][1.5]
IANA:charsetで指定できる文字セット
WebObjects:[日本語技術マニュアル][開発と運用について][API Reference(javadoc)][ADC Tools][サポート]

■関連書籍をAmazonで検索:[WebObjects 和書 洋書]
WebObjectsアプリケーション開発ガイド

にほんブログ村 IT技術ブログへ にほんブログ村 IT技術ブログ プログラム・プログラマへ 人気ブログランキングへ ←この記事が役に立ったという方はクリックお願いします。

|

« MySQL:TINYINT(1)の値 | トップページ | WebObjects:MySQLのためのEOModelの設定 »

プログラミング」カテゴリの記事

WebObjects」カテゴリの記事

トラックバック


この記事へのトラックバック一覧です: WebObjects:日本語の基本:

« MySQL:TINYINT(1)の値 | トップページ | WebObjects:MySQLのためのEOModelの設定 »