Servlet/JSP
Servlet/JSP
Java2 SE 5.0 API
Java2 SE 1.4 API
Java2 EE API
Struts 1.0.2
MSDN2 Library
MySQL 5.1
MySQL 4.1
HTMLリファレンス
CSSリファレンス
JavaScript
基本カラーチャート
カレンダー
 最新PG・講座情報
 最新ニュース
 電子辞書・辞典
ご意見・ご要望はこちらまで

連載

Servlet/JSP

ハイフンなどの文字化けについて


1.状況

 MySQLの旧バージョン(3.52)を利用していた時は、Java(JSP)でDBに漢字を含む項目値を設定する時にはコード変換を設定していました。 4.0にバージョンアップした時に全ての漢字項目が表示できなくなったので、慌ててMySQLの環境設定にデフォルトのコードをShift_JISとして設定することで表示はされました。 ただこの時に今までのコード変換がただ単に漢字を表示させるための手段と勘違いしてしまい、プログラム中の全てのコード変換を削除してしまいました。
 たまたま住所の番地は全て半角の数字とハイフンだったので気が付きませんでしたが、今回全角ハイフンを入力してみて"?"になり文字化けに気が付きました。


2.原因と対処

 原因はJavaでの内部的な文字表現は Unicode が使われており、それぞれの国やOSのデフォルトのエンコーディングから Unicode への変換が行われる際に、 一部の文字で文字化けが発生するということです。 Windows環境のデフォルトコンバータである"MS932"(Windows_31J)と、その他の"JIS", "SJIS", "EUCJIS"とでは、同じ文字が異なる Unicode へマッピングされてしまうのです。

 例えば、全角ハイフン"−"を Unicode へマッピングする場合に、"JIS", "SJIS", "EUCJIS" を使用すると u30FC (先頭のuは Unicode を表します。)、 "MS932" を使用すると uFF0D という具合にコードが変わります。よって住所に「1−2−3」と全角で番地を入力すると「1?2?3」と文字化けしてしまいます。 勿論入力と表示が1つのプラットフォームなら何も問題は生じませんが、これらが別々のプラットフォームの場合に生じる可能性が出てきます。

 次のような文字が化けて"?"となる可能性が高いようです。もちろんこれだけではありませんが、日常的に利用頻度の高いのは"−"と"〜"でしょう。

文字 MS932 SJIS等
FF5E301C
22252016
FF0D2212
¢FFE000A2
£FFE100A3
¬FFE200AC

 これらの対処方法には次のようなことが考えられます。

  • DBへ値を設定する前に入力抑止する。(入力チェック)
  • DBへ値を設定する前に入力した値のコードを変換する。
  • DBから値を表示するときに出力する値のコードを変換する。
 郵便番号に使うハイフンなどは、入力チェックというより半角入力しかできないように「正規表現」を設定してしまえばいいのですが、 何でも入力可の住所などは難しくなります。"−"と"〜"以外はたとえ入力されても逆に"?"となってくれた方がありがたいので、 入力チェックはせず、コード変換の方がいいと思います。
 一度DBに正しく変換されて書き込まれれば、いろいろな箇所で変換なしで読み込むことができますから、コード変換はDBに書き込む前に行うことにします。


3.Javaの変換コード

 ここでは他の入力プログラムからJavaに入力項目を引数で引き渡した場合を想定します。 データベースのテーブルに住所部分(化ける文字が含まれると想定した項目)を書き込む時の内容を抜粋して記述しておきます。

 
 1:  {      ......
 2:
 3:         qStr = "INSERT INTO customer "
 4:             + "(name,kana,yubin,address,tel,mail) VALUES ('"
 5:             + userName      + "','"             // 名前
 6:             + userKana      + "','"             // ふりがな
 7:             + userYubin     + "','"             // 郵便番号
 8:             + u2s(userAddress) + "','"          // 住所(文字化け対策)
 9:             + userTel       + "','"             // 電話番号
10:             + userMail      + "')";             // E-Mail
11:         int Result = stmt.executeUpdate(qStr);  // データの挿入
12:
13:         ......
14:  }
15:  //---- MS932からShiftJISに変換 --------------------------------------
16:  private String u2s(String str) {
17:      try {
18:          str = new String(str.getBytes("MS932"), "SJIS");
19:      } catch (Exception e) {
20:      }
21:      return str;
22:  }
 住所部分(化ける文字が含まれると想定した項目)を書き込む時の内容
 8行目   :他のWebプログラムから入力した住所(引数)をコード変換する。(userXXXX は全て引数)
 11行目   :コード変換した内容でデータベースに実挿入する。
 16-22行目:MS932からShiftJISに変換するメソッド(DBにShift_JISで渡す。)

《参考資料》
   文字化け“???”の法則とその防止策
   ColdFusion MXにて日本語の一部の文字が化けてしまうことについて

Top
Copyright© 2003-2007 FumikiChan All Rights Reserved.
http://www.fumikichan.net/