5.6.文字コード設定について

5.6.1.文字コードについて

Javaにおいて文字コードを意識する箇所を簡単に説明します。

Java内部では文字は全てUnicodeで処理されています。ですが例えば、あるファイルをServletから読み込む場合ファイルはShift_JISで書かれていたとすればShift_JIS<->Unicodeの変換を行わなければJava内部では文字列として使用することができません。

例のようにJavaは外部にI/Oする際に文字コードの変換が発生します。この変換する文字コードが指定されていない場合、Javaでデフォルトとなっている文字コードを使用しますが、デフォルトの文字コードはJavaが動作しているOS環境によって異なります。(Windowsであればwindows-31j、LinuxであればEUC-JP等)

Servlet(Java)への主なI/Oについて概要図を示します。

概要図

  1. HTTPリクエスト
    「リクエストのデータをどの文字コードとしてJavaで扱うUnicodeに変換するか」、の設定があります。

    詳細は 5.6.2.1. HTTPリクエスト 参照

    ※URLに使用できる文字については「5.7.1 URL」を参照してください。

  2. HTTPレスポンス
    「レスポンス出力時、Javaで扱うUnicodeをどの文字コードに変換してレスポンス出力するか」、の設定があります。

    詳細は 5.6.2.2. HTTPレスポンス 参照

  3. JSPファイルのコンパイル
    「JSPファイルをどの文字コードで読み込み、Javaで扱うUnicodeに変換するか」、の設定があります。

    詳細は 5.6.2.3. JSPファイルのコンパイル 参照

    ※ファイル名に使用可能な文字については「5.7.1 URL」を参照してください。

  4. JSPファイルのレスポンス
    「JSPを実行した際、Javaで扱うUnicodeをどの文字コードに変換してレスポンス出力するか」、の設定があります。

    詳細は 5.6.2.4. JSPファイルのレスポンス 参照

  5. ファイル入力/出力
    ファイルにアクセスするInputStream、OutputStreamを作成する際ユーザが文字コードを設定します。WebOTX独自の設定機能は存在しませんがJVMオプション (-Dfile.encoding=)設定によりデフォルトの文字コードを変更できます。

    ※ファイル名に使用可能な文字については「5.7.1 URL」を参照してください。

  6. データベースアクセス
    JDBCドライバに依存します。


次節以降の表中で使用する用語について説明します。

使用できる文字コードはJavaのプラットフォームにより異なります。Javaのマニュアルにてご確認ください。

5.6.2.文字コードの優先順位

文字コードの設定箇所と、それぞれの優先順位を記述します。

5.6.2.1.HTTPリクエスト

リクエストのデータをどの文字コードとして扱うかは通常、以下の処理順で決定されます。ここで決定された文字コードはリクエストからデータを取得する際のInputStreamに適用されます。

優先度 設定項目名 説明 設定場所 有効範囲 反映方法
setCharcterEncoding設定 Filter等でリクエストデータを参照する前に、HttpServletRequest.setCharcterEncoding()により文字コードを設定した場合、その文字コードとしてリクエストデータをUnicodeに変換します。 ユーザロジック Webアプリケーション 再配備
設定例
       :
  ((HttpServletRequest)request).setCharcterEncoding("Shift_JIS");
      :
HTTPリクエストcharset設定 HTTPリクエストのヘッダ情報にcharset指定がある場合、その文字コードでリクエストデータをUnicodeに変換します。 なし Webアプリケーション 再配備
詳細説明
ブラウザ等クライアントアプリケーションに依存しますがHTTPリクエストヘッダにcharset指定がある場合の動作になります。
"Content-Type: application/x-www-form-urlencoded; charset=windows-31j" 等

NEC配備記述子charset設定 HTTPリクエストのヘッダ情報にcharset指定が無い場合、nec-web.xmlファイルに<locale-charset-info>要素を設定し、warファイルに予めアーカイブすることでリクエストデータのUnicode変換に用いるデフォルトの文字コードを設定することができます。 nec-web.xml Webアプリケーション 再配備
設定例
  <nec-web-app>
      :
    <locale-charset-info>
        <parameter-encoding form-hint-field="penc" default-charset="windows-31j"/>
    </locale-charset-info>
      :
  1. リクエストのパラメータ中に該当データ(この場合パラメータ名がpencのデータpenc=x-IBM943C 等)があればそれを文字コードとして使用する。
  2. i)が無い場合、リクエスト中のAccept-Language: ja、無ければnec-web.xmlの default-charset で指定された文字コードを用いてリクエストパラメータをUnicodeに変換
デフォルト設定 上記のいずれも無い場合、リクエストデータはデフォルトの文字コード"ISO-8859-1"を用いてUnicodeに変換されます。 -- -- --
設定例
--

5.6.2.2.HTTPレスポンス

レスポンスにデータをどの文字コードとして出力するかは通常、以下の処理順で決定されます。ここで決定された文字コードはHTTPレスポンスのヘッダ情報(Content-Typeのcharset)とデータを出力する際のOutputStreamに適用されます。

優先度 設定項目名 説明 設定場所 有効範囲 反映方法
文字コード優先設定 Webアプリケーション毎にHTTPレスポンスに優先的に使用される文字コードを設定します。 nec-web.xml Webアプリケーション 再配備
設定例
  <nec-web-app>   
      :
    <property name="priorityResponseEncoding-map:ja" value="EUC-JP"/>  
      :
    <property name="priorityResponseEncoding" value="windows-31j"/>  
設定は両方設定することも片方のみ設定する事も可能です。
前者はHTTPレスポンスのロケールが一致した場合、Mapされた文字コードを適用します。
後者はHTTPレスポンスで使用する文字コードを固定で設定します。
両方が設定され場合、前者のMap設定の優先度が高くなります。

文字コード優先設定 ドメイン(またはプロセスグループ)にHTTPレスポンスに優先的に使用される文字コードを設定します。 domain.xml ドメイン ドメイン(プロセスグループ)再起動
設定例
otxadminコマンド
  set server.web-container.property.priority-response-encoding=EUC-JP


配備記述子文字コード設定 Servlet2.4の仕様でロケールおよび文字エンコードのマッピングをweb.xmlに設定できます。
javax.servlet.ServletResponseのsetLocale()メソッドが呼ばれた時に参照され、設定した ロケールに対応する文字コードが設定されます。
レスポンスデータをUnicodeから設定された文字コードに変換してレスポンス出力します。
web.xml Webアプリケーション 再配備
設定例
  <web-app>
      :
    <locale-encoding-mapping-list>
      <locale-encoding-mapping>
        <locale>ja</locale>
        <encoding>windows-31j</encoding>  
      </locale-encoding-mapping>
      <locale-encoding-mapping>
        <locale>ko</locale>
        <encoding>EUC-KR</encoding>
      </locale-encoding-mapping>
    </locale-encoding-mapping-list>
      :
setCharacterEncoding設定 ServletResponseのsetContentType()またはsetCharacterEncoding()にてcharsetが設定された場合、レスポンスデータをUnicodeから設定された文字コードに変換してレスポンス出力します。 ユーザロジック Webアプリケーション 再配備
設定例
       :
  ((HttpServletResponse)response).
          setContentType("text/html; charset=Shift_JIS")
      :
デフォルト設定 上記の設定が無い場合、レスポンスデータをUnicodeからデフォルトの文字コード"ISO-8859-1"に変換してレスポンス出力します。 -- -- --
設定例
--

5.6.2.3.JSPファイルのコンパイル

JSPファイルがどの文字コードで記述されているか(読み込み時どのエンコーディングでデコードするか)は通常、以下の処理順で決定されます。 ここで決定された文字コードはJSPファイルを読み込む際のInputStremに適用されます。

優先度 設定項目名 説明 設定場所 有効範囲 反映方法
優先文字コード設定 Webアプリケーション毎にJSPファイルのコンパイルに優先的に使用される文字コードを設定します。 nec-web.xml Webアプリケーション 再配備
設定例
  <nec-web-app>
      :
    <jsp-config>
      <property name="priorityJspInEncoding" value="EUC-JP"/>
    </jsp-config>
      :
優先文字コード設定 ドメイン(またはプロセスグループ)にJSPファイルのコンパイルに優先的に使用される文字コードを設定します。 domain.xml ドメイン(プロセスプロセスグループ) ドメイン(プロセスプロセスグループ)再起動
設定例
otxadminコマンド
  set server.web-container.property.priority-jsp-in-encoding=EUC-JP


JSPファイルpageEncoing設定 JSPファイルにpageEncoing設定が記述されている場合、その文字コードでJSPファイルを読み込みUnicodeに変換します。 ユーザロジック JSPファイル 再配備
設定例
<%@ page pageEncoding="windows-31j"%>
      :
JSPファイルcontentType設定 JSPファイルにpageEncoing設定が無くcontentType設定(charset指定)が記述されている場合、その文字コードでJSPファイルを読み込みUnicodeに変換します。 ユーザロジック JSPファイル 再配備
設定例
<%@ page contentType="text/html;charset=windows-31j"%>
      :
配備記述子設定 JSP2.0の仕様でJSPファイル読み込み時の文字コードをweb.xmlに設定できます。contentType設定(charset指定)が無い場合、web.xmlで設定した文字コードでJSPファイルを読み込みUnicodeに変換します。 web.xml Webアプリケーション 再配備
設定例
  <web-app>
      :
    <jsp-config>
      <jsp-property-group>
        <url-pattern>/jsp/*</url-pattern>
        <page-encoding>Shift_JIS</page-encoding>  
      </jsp-property-group>
    </jsp-config>
      :
デフォルト文字コード設定 pageEncoing設定、contentType設定が共に無い、web.xmlの設定も無い場合、デフォルトの文字コードが使用されますが、そのデフォルト文字コードを変更することができます。 domain.xml ドメイン(プロセスプロセスグループ) ドメイン(プロセスプロセスグループ)再起動
設定例
otxadminコマンド
  set server.web-container.property.default-encoding=Shift_JIS


デフォルト設定 上記のいずれの設定も無い場合、JSPファイルはデフォルトの文字コード"ISO-8859-1"で読み込まれUnicodeに変換されます。 -- -- --
設定例
--

5.6.2.4.JSPファイルのレスポンス

出力するレスポンスデータはどのUnicodeから文字コードに変換するかは通常、以下の処理順で決定されます。 ここで決定されたエンコーディングはレスポンスのヘッダ情報(Content-Typeのcharset)と出力する際OutputStreamに適用されます。

優先度 設定項目名 説明 設定場所 有効範囲 反映方法
優先文字コード設定 Webアプリケーション毎にJSPファイルのレスポンスに優先的に使用される文字コードを設定します。 nec-web.xml Webアプリケーション 再配備
設定例
  <nec-web-app>
      :
    <jsp-config>
      <property name="priorityJspOutEncoding" value="EUC-JP"/>
    </jsp-config>
      :
優先文字コード設定 ドメイン(またはプロセスグループ)にJSPファイルのレスポンスに優先的に使用される文字コードを設定します。 domain.xml ドメイン(プロセスプロセスグループ) ドメイン(プロセスプロセスグループ)再起動
設定例
otxadminコマンド
  set server.web-container.property.priority-jsp-out-encoding=EUC-JP


setContentType設定 JSPファイルにcontentType設定(charset指定)が記述されている場合、レスポンスデータをUnicodeから設定文字コードに変換してレスポンス出力します。 ユーザロジック JSPファイル 再配備
設定例
<%@ page contentType="text/html;charset=windows-31j"%>
      :
デフォルト文字コード設定 contentType の設定が無い場合、デフォルトの文字コードが使用されますがそのデフォルト文字コードを変更することができます。 domain.xml ドメイン ドメイン再起動
設定例
otxadminコマンド
  set server.web-container.property.default-encoding=Shift_JIS
デフォルト設定 上記のいずれの設定も無い場合、JSPのレスポンスデータをUnicodeからデフォルトの文字コード"ISO-8859-1"に変換してレスポンス出力します。 -- -- --
設定例
--


5.7.使用可能文字について

各箇所で使用可能な文字について記述します。

5.7.1.URL

RFC3986仕様より、URL 中に書くことが許されているのは、半角アルファベット、数字と以下の(半角)記号です

. $ , ; : & = ? ! * ~ @ # _ - ( ) [ ]

またURLのコンテキスト名以降の各パーツで使用可能な文字を記述します。

http://<server名>:<ポート名>/<コンテキスト名>/<パス>/<サーブレット名>?<パラメータ>

  1. コンテキスト名
    Webアプリケーションを配備する際に指定したコンテキストルートに相当する部分です。
    "/hoho1/hoho2"のようにスラッシュで区切って設定することも可能です。ただし"/hoho1/."のようにピリオド区切り(/)間をピリオドのみで構成することはできません。

    半角アルファベット、数字と以下の(半角)記号が使用可能です。
    . $ ! ~ - _ ( )

  2. サーブレット名
    web.xmlに記述する<servlet-mapping>の<url-pattern>に相当します。"/abc/Servlet1"のようにスラッシュで区切って設定することも可能です。
    アクセスする際は、コンテキスト名"/hoho1/hoho2"、サーブレット名"/abc/Servlet1"と設定した場合
      http://server:port/hoho1/hoho2/abc/Servlet1
    のようにアクセスします。

    半角アルファベット、数字と以下の(半角)記号が使用可能です。
    . $ , : = ! * ~ @ - _ ( ) [ ]

  3. パス
    コンテキスト名と、後術するファイル名の間でWebアプリケーション内のディレクトリ構成に相当します。

    半角アルファベット、数字と以下の(半角)記号が使用可能です。
    . $ , ! ~ @ - _ ( ) [ ]

  4. ファイル名
    htmlやjspのファイル名です。

    半角アルファベット、数字と以下の(半角)記号が使用可能です。
    . $ , & = ! ~ @ - _ ( ) [ ]


  5. パラメータ
    パラメータ名には、半角アルファベット、数字と以下の(半角)記号が使用可能です。
    ※2バイト文字を使用する場合はエンコードした形式(%XX)にする必要があります。通常はブラウザが自動的にエンコードしてくれます。
    . $ , ; : ? ! * ~ @ - _ ( ) [ ]

    パラメータの値には、半角アルファベット、数字と以下の(半角)記号が使用可能です。
    ※2バイト文字を使用する場合はエンコードした形式(%XX)にする必要があります。通常はブラウザが自動的にエンコードしてくれます。
    . $ , ; : = ? ! * ~ @ - _ ( ) [ ]

5.7.2.アカウント/パスワード

Webにおける認証(Basic/Form認証等)に使用するアカウント/パスワードについて記述します。

  1. アカウント
    利用可能な文字は英数字と “-“、”_”です。

  2. パスワード
    英数字と記号が利用できますが、「\」、「”」文字は利用できません。


5.7.3.XMLファイル

要素名、属性名の使用可能文字はXMLの仕様に従います。値にも次の文字は使用できません。