OracleとJavaの間で、全角マイナスが文字化け。
「−」が文字化けする件について
DBの設定はUTF-8
画面等のシステム周りはUTF-8
ただし、一部外部システムとのやり取りに関して、
外部ファイル入出力はMS932
症状)
DBのデータをファイルに落とした際に、文字化けを起こす。
おそらく、System.out.printlnでも同様。
Oracleの文字コード確認
ORACLEの文字コードは
SELECT NLS_CHARSET_NAME(NLS_CHARSET_ID('CHAR_CS')),
NLS_CHARSET_NAME(NLS_CHARSET_ID('NCHAR_CS')) FROM DUAL;
UTF-8を確認
怪しいところ
入力はMS932だし、SQLPlusなどでの表示上は化けていない。
ファイルに落とす前に、Windows-31Jでバイトに崩している。
ちなみに、SJISで崩すと化けない。
変わりに他の文字が化けるけど。
結局
内部的な処理が疑わしいわけで、
槍玉にあがったのが、TO_MULTI_BYTE
どうやら、半角「-」は、この関数によって、
0x2212
であらわされる全角マイナスとなり(UTF-8)
普通に、アプリケーションやらSQL関連ツールを「Windowsで」利用して入れる全角マイナスは
0xff0d(UTF-8)
というわけで、ファイルに落とす前に、上記コード変換で対応しました。
基本的には
http://www.ingrid.org/java/i18n/encoding/ja-conv.html
char -> byte変換時
を参考にし、UnicodeからMS932で×となっている文字を対応してあげればよいわけです。
で、ここで問題となるのが、Unicodeで同じ文字形をしている文字になります。
んで、半角から、全角に出来るのは、マイナスだけなのでマイナスだけ気をつければよさそう。
だけど不安なので、気持ち悪いので全部変換する。
この辺はメールアプリとかと一緒ですね。
雑感
TO_MULTI_BYTE関数にこの辺の引数があってもよいのになぁ〜といった感じ。
もっとも、先に、マイナスを全角マイナスに変換してからTO_MULTI_BYTEするようなのを用意しても
よかったかもしれない。