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

a.br.taka [E-MAIL ADDRESS DELETED]
2010年 12月 25日 (土) 10:12:45 JST


 大塚様
長谷川様
mokkouyou様
成田様

ご返信ありがとうございます。

結論から申しますと、
「JSPのcontent-typeをShift_JISではなくWindows-31J」
にて修正することで文字化けは対応出来ました。
ありがとうございました。

> Shift_JISとWindows-31Jは同じ符号化方式と文字集合ですが、以下2点が異なります。
>
> 1. Windows-31JはShift_JISの文字に加えて機種依存文字を含む
> 2. Shift_JISとWindows-31JはUnicodeとの変換マッピングが異なる文字がある

Windows-31JとShift_JISの相違点については、下記で対応しました。

 1.ですが、仕様として機種依存文字は対象外となっているため
  自製の入力チェックにてはじくようにしました。(@Zenkakuを作成)
 2.ですが、これは'〜'、'‖'、'−'、'¢'、'£'、'¬'のみの認識なので、
  今回の対応で解決できています。


(10/12/24 9:28), Noriyasu NARITA wrote:
> 成田と申します。
>
> 以前類似ケースを調査したことがあります。
> うろ覚えなので間違っているところがあるかもしれませんので一応ご自分でも確認ください。
>
> 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 mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user

-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://ml.seasar.org/archives/seasar-user/attachments/20101225/aceef611/attachment.html>


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