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で同じ文字形をしている文字になります。


んで、半角から、全角に出来るのは、マイナスだけなのでマイナスだけ気をつければよさそう。
だけど不安なので、気持ち悪いので全部変換する。
この辺はメールアプリとかと一緒ですね。

捕捉。全角マイナスなどについて

追記しました。
Unicode内での差について

UTF-8での文字化け - mokkouyou2001の日記


半角マイナス⇒全角マイナス(IBM-Unicode)⇒MS932へ変換(対応する変換ルールが存在しない)

雑感

TO_MULTI_BYTE関数にこの辺の引数があってもよいのになぁ〜といった感じ。
もっとも、先に、マイナスを全角マイナスに変換してからTO_MULTI_BYTEするようなのを用意しても
よかったかもしれない。

最後に

文字コード文字集合、文字エンコーディング、16進表記はU+だとかそういうのは抜きで・・・
いまだに文字コードについてはJavaPressを読んでいたりする・・・