Interstage Application Server/Interstage Web Server トラブルシューティング集
目次 索引 前ページ次ページ

第8章 J2EEアプリケーション開発・運用時の異常

8.8 Webアプリケーションで文字化けが発生する場合の対処

 文字化けの対処方法、および文字化けに影響するコード変換の設定について説明します。

■文字化け状況

 文字化けが発生した場合、原因を追求するために文字化けが起きた状況を確認します。

■チェックポイント

 Servletサービスの運用で文字化けが発生した場合のチェックポイントを以下に示します。

  1. 日本語がすべて“?”に文字化けする場合、ロケールに必要なパッケージがインストールされているか確認して下さい。
  2. 一部の文字が文字化けする場合、ロケールの設定を確認して下さい。
    ロケールの設定については、“ロケールの設定”を参照してください。
  3. サーブレットアプリケーションの受取時に文字化けする場合、“Webアプリケーションのエンコーディング”(注)を見直し、正しく設定してください。
  4. “Shift_JIS”と“SJIS”が混在している場合、charsetへの設定は統一してください。
    Charsetへの設定については、“Webアプリケーションのコード系”を参照してください。
  5. 特殊文字「〜」などが文字化けして“?”になる場合、日本語コード(JIS、EUC、シフトJIS)をUnicodeに変換する際の変換規則が異なるために文字化けが発生している可能性がありますので、コード系は統一してください。統一できない場合は、WebアプリケーションでUnicodeから変換する直前にフィルターをかけ対処してください。
  6. コード系に“JISAutoDetect”(自動変換)が設定されている場合、短い日本語文字列などはコード系の認識が正しく行われずコード変換が正しく行われないことがあります。(例として、日本語EUCの文字をShift-JISの半角カタカナだと誤認識した場合、半角カタカナを含む判読不可能な文字列になります。)
  7. JDK1.4.1からエンコーディング名“Shift_JIS”の扱いが変更されました。このため、“Webアプリケーションのエンコーディング”(注)に“Shift_JIS”を指定している場合、JDK1.3で動作していたWebアプリケーションをJDK1.4で動作させると文字化けが発生することがあります。
    JDK1.4でJDK1.3と同様に動作させるには、“Webアプリケーションのコード系”に“windows-31j”を指定してください。

 注) “Webアプリケーションのエンコーディング”は、Interstage管理コンソールの以下の項目で設定します。

ロケールの設定

 JavaVM、javac、native2asciiなどのツールは、ロケールの設定に基づいて動作します。Servletサービスでも同様にロケールの設定に基づいて動作します。ロケールの設定方法について説明します。

【ロケール】
 ロケール(Locale)とは、共有する言語や文化に依存するさまざまな属性をひとまとめにして定義しています。

[コントロールパネル]の[地域(または地域のオプション)]でロケールを設定します。
注) Windows(R) 2000の場合の説明です。使用するOSにより操作方法は異なる場合があります。
環境変数LANGにロケールを設定します。

コード系

ロケール

EUC

Ja
ja_JP.eucJP

シフトJIS

ja_JP.PCK

UTF-8

ja_JP.UTF-8

Webアプリケーションのコード系

 WebアプリケーションのサーブレットはJava言語で作成するため、内部で処理する日本語コード系はUNICODEです。そこで、Webブラウザから入力された日本語文字はUNICODEへ、Webブラウザへ表示する文字はUNICODEから日本語のコードに変換する必要があります。
 JSPもJavaファイルに変換され実行されるので、コード変換の設定が必要となります。

 コード変換の設定方法を説明します。

◆サーブレット

 [HTMLのコード系]
 “charset”を設定します。

記述例(Shift_JIS)
-------------------------------------------------------------------------------
  <meta http-equiv="Content-type" content="text/html; charset=Shift_JIS">
-------------------------------------------------------------------------------

 [入力コード系]
 ブラウザからの受信時にコンバータを使用し、文字変換を行います。

記述例(SJIS→Unicode)
-------------------------------------------------------------------------------
  request.setCharacterEncoding("SJIS");
  String in_value1 = request.getParameter("param1");
-------------------------------------------------------------------------------

 Interstage管理コンソールで“Webアプリケーションのエンコーディング”項目を指定している場合は、コード変換を行う必要はありません。

 [出力コード系]
 処理結果をWebブラウザに返す時、文字変換を行うためにコンバータ指定します。

記述例(Unicode→SJIS)
-------------------------------------------------------------------------------
  request.setContentType("text/html; charset=SJIS");
  PrintWriter out = response.getWriter();
-------------------------------------------------------------------------------

 setContentType() はgetWriter() を取得する前に呼び出す必要があります。

◆JSP

記述例
-------------------------------------------------------------------------------
  <%@ page session="false" contentType="text/html; charset=SJIS" %>
  <%
  response.setContentType("text/html; charset=EUC_JP");
  %>
  <HTML>
  <TITLE>日本語テスト(EUC_JP 出力)</TITLE>
  <BODY BGCOLOR="black" TEXT="yellow">
  <H1>日本語テスト(EUC_JP 出力)<BR></H1>
-------------------------------------------------------------------------------

■文字化け特殊文字

 以下に、文字化け特殊文字の対応表を掲載します。

JIS X 0208

Unicodeへの変換

33 ('〜')

EUC:a1c1

Solaris上での変換:
U+301c (WAVE DASH)

SJIS:8160

Windows(R)上での変換:
U+ff5e (FULLWIDTH TILDE)

01-34 ('‖')

EUC:a1c2

Solaris上での変換:
U+2016 (DOUBLE VERTICAL LINE)

SJIS:8161

Windows(R)上での変換:
U+2225 (PARALLEL TO)

01-61 ('−')

EUC:a1dd

Solaris上での変換:
U+2212 (MINUS SIGN)

SJIS:817c

Windows(R)上での変換:
U+ff0d (FULLWIDTH HYPHEN-MINUS)

01-81 ('¢')

EUC:a1f1

Solaris上での変換:
U+00a2 (CENT SIGN)

SJIS:8191

Windows(R)上での変換:
U+ffe0 (FULLWIDTH CENT SIGN)

01-82 ('£')

EUC:a1f2

Solaris上での変換:
U+00a3 (POUND SIGN)

SJIS:8192

Windows(R)上での変換:
U+ffe1 (FULLWIDTH POUND SIGN)

02-44 ('¬')

EUC:a2cc

Solaris上での変換:
U+00ac (NOT SIGN)

SJIS:81ca

Windows(R)上での変換:
U+ffe2 (FULLWIDTH NOT SIGN)


目次 索引 前ページ次ページ

Copyright 2008 FUJITSU LIMITED