[Seasar-user:20459] Re: OracleのUnicode問題について

Noriyasu NARITA [E-MAIL ADDRESS DELETED]
2010年 12月 24日 (金) 09:28:09 JST


成田と申します。

以前類似ケースを調査したことがあります。
うろ覚えなので間違っているところがあるかもしれませんので一応ご自分でも確認ください。

Shift_JISとWindows-31Jは同じ符号化方式と文字集合ですが、以下2点が異なります。

1. Windows-31JはShift_JISの文字に加えて機種依存文字を含む
2. Shift_JISとWindows-31JはUnicodeとの変換マッピングが異なる文字がある

今回問題は2のマッピング差異が原因と思われます。

Unicode上の波文字には、

WAVE_DASH(U+301C)
FULLWIDTH_TILDE(U+FF5E)

の2種類があります。

Shift_JISやWindows-31JをUnicodeに変換する場合、
Shift _JIS/Windows-31J上の「〜」(0x8160) をどっちのUnicode上の波文字にマッピングするかは、

Shift_JISの場合:U+301C
Windows-31Jの場合:U+FF5E

となるようです。

OracleのJA16SJISTILDEはWindows-31J相当のUnicodeマッピングを行うため、
DB上に格納された0x8160はJava上でU+FF5Eに変換されます。
さらに画面に出力するため、U+FF5EをShift_JISに変換した際、マッピング先が無いためエラーとなります。
(エラーというか?にマッピングされてしまったような記憶があります)

解決方法は以下の3つの方法があると思います。

1. DBのcharsetをJA16SJISTILDEではなくJA16SJISにする
2. Java上でU+FF5EをU+301Cに変換する
3. JSPのcontent-typeをShift_JISではなくWindows-31Jで出力する

1についてはDB側のキャラセットをJA16SJISにし、DB、画面とも一貫してShift_JISとして扱い
マッピングの差異に関する問題が発生しないようにします。

2についてはなんらかの方法でDBから取得したWindows-31JベースでマッピングされたUnicodeを
Shift_JIS ベースに置き換えます。
たしかs2jdbcのOracleDialectにはこの置き換えをするためのコードが入っていたので、
diconでなにかを有効にしたら実現できるかもしれません。
(あやふやですいません。seasarの方フォローをお願いします )

3についてはJSPのcontent-typeをWndows-31Jで出力し、DB、画面とも一貫してWindows-31Jとして扱い
マッピングの差異に関する問題が発生しないようにします。

以上よろしくお願いします。

2010年12月23日14:24 a.br.taka <[E-MAIL ADDRESS DELETED]>:
> お世話になっ ております。
> 阿 比留と申します。
>
> 今回、 SAStruts+S2JDBCを利用してシステム開発を行っており、
> OracleのUnicode変換での文字化けについて質問がございます。
> (SAStruts、S2JDBCは初心者レベルです。)
>
> 画 面から 文字化け文字('〜'、'‖'、'−'、'¢'、'£'、'¬')を入力しDBへ登録、
> それを取得し画面に表 示すると文字化けが発生します。
> DBから取得した値を画面に渡す ための変換処理(JA16SJISTILDE→SJIS)が
> 必要だと思うのですが、どこでどのように変換処理を実装するのでしょうか?
>
> 状況を調べたところ、下記のような状況までは確認できています。
>  ・画面(SJIS)→Unicode→DB(JA16SJISTILDE)
>    この場合は、SJIS→JASJISTILDEへ想定通り変換されます。
>    例) 0x8191→U+00A2→U+FFE0
>
>   ・DB(JA16SJISTILDE)→Unicode→画面(SJIS)
>    この場合は、文字化けになってしまいます。
>    例) U+FFE0→U+00A2→NG(0x8191 にならない)
>
> ちなみに、下記以外は特に文字コードの設定は行なっておりません。
>   ・JSP(charset=Shift_JIS)
>   ・EncodingFilter(charset=Shift_JIS)
>  ・DB(JASJISTILDE)
>
> ■ 環境
> DB:Oracle11g  Release2
> OS:Linux
> WEB:Apache 2.2.16
> AP:Tomcat 6.0.29
> そ の他:
>   Java6
>   sa-struts-1.0.4-sp8.jar
>   s2-framework-2.4.43.jar
>
> 下記のように 同様の質問や方法もございましたが、
> ど うしてもわからない状態です。
>
>http://ml.seasar.org/archives/seasar-user/2006-August/006334.html>
>http://ml.seasar.org/archives/seasar-user/2004-June/000795.html>
>http://d.hatena.ne.jp/higayasuo/20040915/1095232861>
>
> 少しでも進展 になるような情報が頂ければと思います。
> 以 上です。宜しくお願い致します。
>
>
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>
>


Seasar-user メーリングリストの案内