UTF-8からJIS,SJIS,EUCJPに文字コード変換すると文字化けするの巻き

UTF-8で「〜」や「‖」などが文字コード変換すると「?」に文字化けするのです。
かなり嵌ってしまいました・・・
いろいろ調べているとほかにも困っている人が多いようでした。
なので、sourceforgeで化けないように変換するソースが公開されていました。
http://sourceforge.jp/cvs/view/nagaraichat/iCC/ome/ome-core/OME_JavaProject/old-src/Cp932.java?revision=1.1.1.1&view=markup

リンク切れ防止にソースを貼り付けておく
toJisの引数の文字列(UTF-8)の文字化けするものを化けない文字に変換して返してくれる。

String jis = new String( Cp932.toJIS("〜").getBytes( "JIS" ));
package OME;

/*
 * The Cp932 class contains a utility method for converting Microsoft's
 * Cp 932 into JIS.
 * 
 * http://java-house.etl.go.jp/ml/archive/j-h-b/014452.html
 *
 * @author Kazuhiro Kazama
 * @version 1.0 01/06/97
 */
import java.util.Locale;

public class Cp932 {

    private static boolean isCp932 = false;

    static {
        String p = System.getProperty("iscp932");
        String os = System.getProperty("os.name");
        if (Locale.getDefault().getLanguage().equals("ja")) {
            isCp932 = true;
            /*	    if (p != null && Boolean.getBoolean(p))
             isCp932 = true;
             else if (os != null && (os.equals("Windows 95") || os.equals("Windows NT")))
             isCp932 = true;
             */}
        //        Logging.writeMessage("Cp932 : p = "+p);
        //        Logging.writeMessage("Cp932 : os = "+os);
        //        Logging.writeMessage("Cp932 : isCp932 = "+isCp932);
    }

    /*
     * You can't use this constructor.
     */
    private Cp932() {}

    /*
     * This method converts Cp932 to JIS.
     */
    public static String toJIS(String s) {
        if (!isCp932) return s;
        StringBuffer sb = new StringBuffer();
        char c;
        for (int i = 0; i < s.length(); i++) {
            c = s.charAt(i);
            switch (c) {
            case 0xff3c:
                // FULLWIDTH REVERSE SOLIDUS ->
                c = 0x005c; // REVERSE SOLIDUS
                break;
            case 0xff5e:
                // FULLWIDTH TILDE ->
                c = 0x301c; // WAVE DASH
                break;
            case 0x2225:
                // PARALLEL TO ->
                c = 0x2016; // DOUBLE VERTICAL LINE
                break;
            case 0xff0d:
                // FULLWIDTH HYPHEN-MINUS ->
                c = 0x2212; // MINUS SIGN
                break;
            case 0xffe0:
                // FULLWIDTH CENT SIGN ->
                c = 0x00a2; // CENT SIGN
                break;
            case 0xffe1:
                // FULLWIDTH POUND SIGN ->
                c = 0x00a3; // POUND SIGN
                break;
            case 0xffe2:
                // FULLWIDTH NOT SIGN ->
                c = 0x00ac; // NOT SIGN
                break;
            }
            sb.append(c);
        }
        return new String(sb);
    }

    /*
     * This method convert JIS to Cp932.
     */
    public static String toCp932(String s) {
        if (!isCp932) return s;
        StringBuffer sb = new StringBuffer();
        char c;
        for (int i = 0; i < s.length(); i++) {
            c = s.charAt(i);
            switch (c) {
            case 0x005c:
                // REVERSE SOLIDUS ->
                //		c = 0xff3c;	// FULLWIDTH REVERSE SOLIDUS
                c = 0x00a5; //Yen Mark ( by msyk )
                break;
            /*	不要みたい、これ
             case 0x301c:	// WAVE DASH ->
             c = 0xff5e;	// FULLWIDTH TILDE
             break;
             */
            case 0x2016:
                // DOUBLE VERTICAL LINE ->
                c = 0x2225; // PARALLEL TO
                break;
            /*	これも不要みたい
             case 0x2212:	// MINUS SIGN ->
             c = 0xff0d;	// FULLWIDTH HYPHEN-MINUS
             break;
             */case 0x00a2:
                // CENT SIGN ->
                c = 0xffe0; // FULLWIDTH CENT SIGN
                break;
            case 0x00a3:
                // POUND SIGN ->
                c = 0xffe1; // FULLWIDTH POUND SIGN
                break;
            case 0x00ac:
                // NOT SIGN ->
                c = 0xffe2; // FULLWIDTH NOT SIGN
                break;
            }
            sb.append(c);
        }
        return new String(sb);
    }
}