スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ISO-2022-JP 丸数字等の文字化け

ベンダーからjavaの質問を受け、答えることに。バージョンは1.4系。
POPサーバからメールを読み取り、Unicodeに変換する際に一部文字化けすると。
通常、メールはJISでエンコーディングされているので、ISO-2022-JPを指定して変換する。

その前にもShift_JISについて質問を受けたときは、すぐにShijt_JISとWindows-31Jの混同の問題だとすぐにわかり、SJISではなく、MS932を使えと回答し、簡単に問題は解決した。

ところが今回はそうは行かない。機種依存文字はもちろんのこと、
―~∥-
これらの文字も文字化けする。new String(bytes, "ISO-2022-JP");でファイルから読み込んだバイト配列をJISコードとして読み取り、Unicodeへ変換するのであるが、Unicodeへのマッピングがおかしい。Unicodeの見地からすれば、これらの文字はJISとShift_JISでは別物のようだ。これは次のような、修正メソッドをかませれば修復できる。


public static String JIStoUnicode(String s) {
char[] c = s.toCharArray() ;
for (int i = 0 ; i < c.length ; i++) {
switch (c[i]) {
case '\u2014': // '―'
c[i] = '\u2015' ;
break ;
case '\u301c': // '~'
c[i] = '\uff5e' ;
break ;
case '\u2016': // '∥'
c[i] = '\u2225' ;
break ;
case '\u2212': // '-'
c[i] = '\uff0d' ;
break ;
default:
break ;
}
}
return new String(c) ;


ところが、丸数字等の機種依存文字については、同じようには行かない。Unicodeへの変換の際に対応する文字がなく、すべてfffdに変換されてしまっているので、コンバータに手を加えるほかない。コンバータがどこにあるかソースに当たってみた。
sun.nio.cs.ext.ISO2022_JP
というクラスだったが、さすがにこれには手を加えられない。

ネットで同様の問題にどう対応しているのか探してみたが情報はほとんどない。@itの会議室で対応のために自作でコンバータを作った旨書いてあったが、一般にこのように回避するというのはなかった。自作で作らせるのは大変なことだろうという気がする。

そもそも、丸数字を含むNECやIBMの拡張コードは、ISO-2022-JPに規定されていないのだから、javaのコンバータが変換しなくてもいいのは正論だ。ただ現状ではそうも行かない。

丸数字や半角カタカナをメールで使ってはならないというのはもはや過去の話だ。いまだに、「ネチケット」と称して、それを振り回しているのも多いが、現実上、丸数字は、メールで当たり前のように飛び交っている。もっとも半角カタカナは全角にメーラで変換されてしまうことが多いが。(メールマガジンのように不特定多数への送信にはいまでも気をつけた方がいいとは思う)。

JISコードでは、丸数字は2D21から割り当てられ、Shift_JISでは8740から割り当てられている。nkfコマンドを使うと、相互の変換は正しく行われる。IEでもJISの丸数字は正しく表示される。Outlook Express、Wzエディタ、BeckyでもOK。しかし秀丸だと駄目だった。

また、HotmailやYahooメールなどのWebメールも、JISで送ったメールの丸数字はきちんと表示される。それぞれShift_JIS、UTF-8に変換されているが。

ユーザにとっては、普通にメールで使えているのに、Javaのアプリケーションにしたとたんに使えなくなるというのは、おかしい、ということになる。Webメールやメーラーでjavaで作られたものはないのだろうか。あまりにも情報がなさ過ぎる。まあ、他言語でも同じようなものだったが。

nkfにしろ、対応エディタにしろ、JISとShift_JISの変換は計算式を当ててやっているだけだと思うが、Javaのコンバータでも同じようにしてくれればいいと思う。おそらくUnicodeへのマッピングは規定していないのだろう。1.5だとどうなのだろうか。

自前で作るか、nkfをjavaから呼び出して、Shift_JISに変換して取り組むか。
文字コードは厄介だ。

関連記事
スポンサーサイト

コメント

非公開コメント

nkfなどの外部プロセスを呼び出すより、自前でまず、JISをShift_JISに変換する方が簡単だった。40行程度のロジックで簡単に変換できる。

Javaメールは私も苦労しました。

同様にコンバータを作った覚えがありますが(2年ほど前)、今でもこれといった解決策はないんじゃないでしょうか。

プロフィール

dayan

Author:dayan
小職は、SE(システムエンジニア)を専門としておりますが、技術的な情報を中心に、それ以外に経済関連の日記、たわいもない日記も載せていきます。
[公式HPもよろしく!]

天気予報

-天気予報コム- -FC2-
リンク
ブロとも申請フォーム

この人とブロともになる

カテゴリー
最近の記事
ブログ内検索
最近のコメント
最近のトラックバック
RSSフィード
月別アーカイブ


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。