javaと文字コードとEUC-JPとShift-JISとWindows-31J

UnixWindowsからTCP経由で受け取ったデータをjavaで処理する用事があってふと、困った。
受け取った文字列が全部?????????????????とか。
基本はReader/Writer系のコンストラクタの自動判定に任せるべきなのだが、
事情により使えない場合などは、こうしている。


/** 引数にWindows-31Jを受け取りEUC-JPを返す */
public String getEucString(String winstr)
{
byte[] uni_bs = winstr.getBytes("Windows-31J"); // unicodeのbyte[]へ
return new String(uni_bs,"EUC-JP"); // unicodeからEUC-JPへ
}
Windowsから受け取るため、Shift-JISではなくWindows-31Jというエンコードを使用する。
しかし、
Windows-31Jの文字:UNICODEの文字:EUC-Jの文字が1:1:1に対応しない場合が存在するため、その場合は???????な文字列ができてしまう。
例えば、「−」などは、?になる。
そういう文字は個別に変換テーブルを自前で持つしかない。。。凄く面倒。
まぁ、ハイフンなら何とかなりそうなもんなんだが、㈱や①などちょっといやーん、な文字も存在する。
そんな文字入力してんじゃねぇよ、という気分になるのだが、結局、
㈱は(株)2byteから6byteへ
①は(1)2byteから6byteへ
という、バッファ長まで変えてみたり、とか。
こうして、徐々にソースが汚くなってゆく。。。