文字化けの対処方法、および文字化けに影響するコード変換の設定について説明します。
■文字化け状況
文字化けが発生した場合、原因を追求するために文字化けが起きた状況を確認します。
文字化けする文字と文字化けしない文字の区別をする。
文字化けが発生している箇所を特定する。
文字化けが発生している箇所の文字を16進で表示する。
■チェックポイント
Servletサービスの運用で文字化けが発生した場合のチェックポイントを以下に示します。
日本語がすべて“?”に文字化けする場合、ロケールに必要なパッケージがインストールされているか確認してください。
一部の文字が文字化けする場合、ロケールの設定を確認してください。
ロケールの設定については、“■ロケールの設定”を参照してください。
サーブレットアプリケーションの受取時に文字化けする場合、“Webアプリケーションのエンコーディング”(注)を見直し、正しく設定してください。
“Shift_JIS”と“SJIS”が混在している場合、charsetへの設定は統一してください。
Charsetへの設定については、“■Webアプリケーションのコード系”を参照してください。
特殊文字「~」などが文字化けして“?”になる場合、日本語コード(JIS、EUC、シフトJIS)をUnicodeに変換する際の変換規則が異なるために文字化けが発生している可能性がありますので、コード系は統一してください。統一できない場合は、WebアプリケーションでUnicodeから変換する直前にフィルターをかけ対処してください。
コード系に“JISAutoDetect”(自動変換)が設定されている場合、短い日本語文字列などはコード系の認識が正しく行われずコード変換が正しく行われないことがあります。(例として、日本語EUCの文字をShift-JISの半角カタカナだと誤認識した場合、半角カタカナを含む判読不可能な文字列になります。)
JDK/JRE 1.4.1からエンコーディング名「Shift_JIS」の扱いが変更されました。このため、“Webアプリケーションのエンコーディング”(注) に“Shift_JIS”を指定している場合、JDK/JRE 1.3で動作していたWebアプリケーションを動作させると文字化けが発生することがあります。
JDK/JRE 1.3と同様に動作させるには、“■Webアプリケーションのコード系”に“windows-31j”を指定してください。
注) “Webアプリケーションのエンコーディング”は、Interstage管理コンソールの以下の項目で設定します。
[ワークユニット] > “ワークユニット名” > [配備]タブ > [詳細設定] > [Webアプリケーション設定] > [エンコーディング]
[ワークユニット] > “ワークユニット名” > “Webアプリケーション名” > [環境設定]タブ > [エンコーディング]
■ロケールの設定
JavaVM、javac、native2asciiなどのツールは、ロケールの設定に基づいて動作します。Servletサービスでも同様にロケールの設定に基づいて動作します。ロケールの設定方法について説明します。
【ロケール】
ロケール(Locale)とは、共有する言語や文化に依存するさまざまな属性をひとまとめにして定義しています。
[コントロールパネル]の[時計、言語、および地域]でロケールを設定します。
注) Windows Server(R) 2012の場合の説明です。使用するOSにより操作方法は異なる場合があります。
環境変数LANGにロケールを設定します。
コード系 | ロケール |
---|---|
EUC | ja |
シフト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)
response.setContentType("text/html; charset=SJIS"); PrintWriter out = response.getWriter();
setContentType() はgetWriter() を取得する前に呼び出す必要があります。
注意
コード系に存在しない文字がある場合、コード変換が正しく行われないことがあります。
HTMLファイルのコード系、入力コード系、出力コード系を統一していない場合、文字化けの原因になります。
入力コード系に“JISAutoDetect”(自動変換)が設定されている場合、コード変換が正しく行われないことがあります。HTMLファイルのコード系と同じコード系を設定してください。
JSP
<%@ page>タグのcharset属性では、JSPを記述したコード系を指定します。日本語コードを扱うためには、charset属性は必ず指定してください。
出力コード系は、“<%”と“%>”の中でsetContentTypeメソッドを使用して指定します。JSPを記述したコード系と同じときには、省略することができます。
コード系の“charset”に設定する文字コードセットについては、JDKのドキュメントを参照してください。JDKのバージョンで異なりますが、EUC_JP、SJIS、ISO-2022-JP(ISO2022JP)などを日本語コード系として指定することができます。
記述例
<%@ 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上での変換: |
SJIS:8160 | Windows(R)上での変換: | |
01-34 (‘∥’) | EUC:a1c2 | Solaris上での変換: |
SJIS:8161 | Windows(R)上での変換: | |
01-61 (‘-’) | EUC:a1dd | Solaris上での変換: |
SJIS:817c | Windows(R)上での変換: | |
01-81 (‘¢’) | EUC:a1f1 | Solaris上での変換: |
SJIS:8191 | Windows(R)上での変換: | |
01-82 (‘£’) | EUC:a1f2 | Solaris上での変換: |
SJIS:8192 | Windows(R)上での変換: | |
02-44 (‘¬’) | EUC:a2cc | Solaris上での変換: |
SJIS:81ca | Windows(R)上での変換: |