Standard Taglib トピックス

メインメニュー

JSTL 最新情報

JSTL プログラミング

その他

著者専用メニュー

JSTL プログラミング - i18n タグ印刷用ページはまだ利用できません

インデックス

ServletRequest / ServletResponse の文字エンコーディング
執筆者:小川 環 2002.07.27更新
概要

i18n タグを実行すると、ServletRequest もしくは ServletResponse の文字エンコーディングが設定されます。

  文字エンコーディングをセットするメソッド 
ServletRequest  setCharacterEncoding() 
ServletResponse  setLocale() 
このことをしっかり把握しておかないと、予期せぬ文字化け表示を引き起こしてしまうことがあります。 たいへん便利なタグではありますが、使い方には少し注意しないといけません。
そこで、ServletRequest / ServletResponse の文字エンコーディングの設定処理に関する簡単な表を、以下に示しておきます。 大事なポイントは、i18n タグの実行時に、文字エンコーディングがどのように決定されていくかということです。
タグ名称  ServletRequest
文字エンコーディング
 
ServletResponse
文字エンコーディング
 
<fmt:setLocale>  --   (2) 
<fmt:bundle>  --   (3) or (4) 
<fmt:setBundle>  --   (3) or (4) 
<fmt:message>  --   (3) or (4) 
<fmt:requestEncoding>  (1)  --  
<fmt:timeZone>  --   --  
<fmt:setTimeZone>  --   --  
<fmt:formatNumber>  --   (3) or (4) 
<fmt:parseNumber>  --   (3) or (4) 
<fmt:formatDate>  --   (3) or (4) 
<fmt:parseDate>  --   (3) or (4) 
"--" = 文字エンコーディングの設定を行わない
(1) = 指定した文字エンコーディングをセットする
(2) = 指定した地域に対応する文字エンコーディングをセットする
(3) = ブラウザの設定地域に対応する文字エンコーディングをセットする
(4) = <fmt:setLocale>で指定された地域に対応する文字エンコーディングをセットする
 

Note JspWriter オブジェクトに対して、十分なバッファが確保されていることを前提とします。

Note 指定した地域に対して ServletResponse に設定される文字エンコーディング名は、
すべての Servlet コンテナで一定にマッピングされているとは限りません。

文字化け対策1 リソースバンドルをフル活用する

ページ中のタイトル、キャプション、メッセージなどは、<fmt:message> タグを使って必ず表示させるようにし、特定の地域でしか取り扱えない文字をハードコーディングすることは基本的に避けましょう。

文字化け表示を誘発してしまうサンプルコード

<%@ page language="java" pageEncoding="Shift_JIS" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>

<%-- メッセージ・リソースの登録 --%>
<fmt:setBundle basename="sample.Resources" var="message"/>

<html>
<head>
<title>i18n タグのサンプル</title>
</head>
<body>
<h2>メッセージ</h2>
<fmt:message key="sample" bundle="${message}"/>
</body>
</html>
日本語 ( ja, ja-JP, etc. ) 以外の設定地域で要求すると、
タイトル ( <title> ) やキャプション ( <h2> ) のテキストが化けて表示される。
リソースバンドルをフル活用した、模範的なサンプルコード

<%@ page language="java" pageEncoding="Shift_JIS" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>

<%-- メッセージ・リソースの登録 --%>
<fmt:setBundle basename="sample.Resources" var="message"/>

<html>
<head>
<title><fmt:message key="title" bundle="${message}"/></title>
</head>
<body>
<h2><fmt:message key="caption" bundle="${message}"/></h2>
<fmt:message key="sample" bundle="${message}"/>
</body>
</html>
日本語 ( ja, ja-JP, etc. ) 以外の設定地域で要求しても、
タイトルやキャプションを含めたメッセージ表示の文字化けを確実に防ぐことができる。
また、<fmt:message> に必要な ResouceBundle のカスタマイズにおいては、その表示対象となる地域を明確にしておくことも大切です。 例えば、サーバ内の専用エラーメッセージとクライアントの入力エラーメッセージの定義を、1つのメッセージ・リソースへまとめるようにしないといったことです。

文字化け対策2 異なる地域同士のコンテンツを1つのJSPページに混在させない

1つの JSP ページで、ServletResponse の文字エンコーディングが異なる地域同士のコンテンツを混在させるのは望ましくありません。 そういう意味で、"standard-examples" ( Standard Taglib v1.0 付属の例題アプリケーション ) に含まれる FormatNumber.jsp は模範的なサンプルであると、ちょっと言い難いかもしれません。

Note Jakarta Taglibs のほうでも FormatNumber.jsp の問題点を十分把握しており、
Standard Taglib の次回リリース ( v1.0.1 ) にて、その代わりとなる例題が提供されています。

文字化け対策3 <meta>タグを使ってコンテンツ・タイプを設定しない

i18n タグの実行時に ServletResponse の文字エンコーディングが Servlet コンテナによって動的に決定されることを考慮すると、下に示す1行を HTML 中に含めることは望ましくありませんので、注意が必要です。

  <meta http-equiv="Content-Type" content="text/html; charset=..."> 
動的なコンテンツにおいては、文字化け対策としてよく用いられている <meta>タグを使ってコンテンツ・タイプを設定することを絶対に避けるべきです。

J2SE のバージョンによる通貨記号表示の違い
執筆者:小川 環 2002.06.26更新
概要

J2SE 1.4 では、通貨書式を取り扱う java.util.Currency クラスが新たに追加されました。
J2SE 1.4 ベースのランタイム環境で Servlet コンテナを起動した場合、java.util.Currency クラスで通貨書式を取り扱うように JSTL 仕様で定めています。 このため、Servlet コンテナを立ち上げる J2SE のバージョン次第で、<fmt:formatNumber type="currency" ... /> で表示される通貨記号は同一とならない場合があります。

"ja-JP" をベース地域に設定した場合に表示される通貨記号の条件別比較表

J2SE バージョン  "currencyCode"
( ISO通貨コード )
 
"currencySymbol"
( 通貨記号 )
 
実際に表示される
通貨記号
 
すべて  --   --   ¥(\uFFE5) 
J2SE 1.4 以前  JPY  --   JPY 
J2SE 1.4  JPY  --   ¥(\uFFE5) 
すべて  --   ¥(\uFFE5)  ¥(\uFFE5) 
J2SE 1.4 以前  JPY  ¥(\uFFE5)  ¥(\uFFE5) 
J2SE 1.4  JPY  ¥(\uFFE5)  ¥(\uFFE5) 
青色表示 = ベース地域のデフォルト通貨記号
赤色表示 = ベース地域の "currencyCode" 属性に対応する通貨記号
緑色表示 = "currencySymbol" に指定した属性値
 

ブラウザ・ベースの地域で通貨書式を扱うためのちょっとした注意点
執筆者:小川 環 2002.07.27更新
概要

地域ベースで通貨書式を決定する場合、ISO-3166 で定義された国コードが地域情報に含まれていないといけません。
ところが、ブラウザの地域で通貨書式を扱う際、使用するブラウザによっては、国コードを含めた地域情報が初期設定されていない可能性があります。 例えば、日本の場合は "ja-JP" という地域情報となっていなければならないのに、実際の地域設定が "ja" とされているケースです。
ブラウザの地域を元に通貨書式を扱うときは、設定されている地域情報を前もって確認しておきましょう。


Copyright (c) 2002 The Ja-Jakarta Project. All rights reserved.