package jp.co.y_net.amm.common;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.apache.wicket.model.Model;


public class AppStringUtils {
    
    public static String trim(String src) {
        if(src == null) return "";
        return src.trim();
    }
    public static String trim(Model<ChoiceElement> ceModel) {
        if(ceModel == null) return "";
        if(ceModel.getObject() == null) return "";
        return  trim(ceModel.getObject().getId());
    }
    public static String trimHalf(String str) {
        return convZenkakuToHankaku(trim(str));
    }
    
    
    
    
    
    
    
    
    /* ------------------------------------------------------------------------------------------------------------ */
    /*
     * 既存より移植
     */
    
    /** 半角カタカナ<-->全角カタカナ変換テーブル */
    private static final String kanaHanZenTbl[][] = {
        /** 2文字構成の濁点付き半角カナ */
        /** 必ずテーブルに先頭に置いてサーチ順を優先すること */
        { "ｶﾞ", "ガ" }, { "ｷﾞ", "ギ" }, { "ｸﾞ", "グ" }, { "ｹﾞ", "ゲ" }, { "ｺﾞ", "ゴ" },
        { "ｻﾞ", "ザ" }, { "ｼﾞ", "ジ" }, { "ｽﾞ", "ズ" }, { "ｾﾞ", "ゼ" }, { "ｿﾞ", "ゾ" },
        { "ﾀﾞ", "ダ" }, { "ﾁﾞ", "ヂ" }, { "ﾂﾞ", "ヅ" }, { "ﾃﾞ", "デ" }, { "ﾄﾞ", "ド" },
        { "ﾊﾞ", "バ" }, { "ﾋﾞ", "ビ" }, { "ﾌﾞ", "ブ" }, { "ﾍﾞ", "ベ" }, { "ﾎﾞ", "ボ" },
        { "ﾊﾟ", "パ" }, { "ﾋﾟ", "ピ" }, { "ﾌﾟ", "プ" }, { "ﾍﾟ", "ペ" }, { "ﾎﾟ", "ポ" },
        { "ｳﾞ", "ヴ" },
        /** 1文字構成の半角カナ */
        { "ｱ", "ア" }, { "ｲ", "イ" }, { "ｳ", "ウ" }, { "ｴ", "エ" }, { "ｵ", "オ" },
        { "ｶ", "カ" }, { "ｷ", "キ" }, { "ｸ", "ク" }, { "ｹ", "ケ" }, { "ｺ", "コ" },
        { "ｻ", "サ" }, { "ｼ", "シ" }, { "ｽ", "ス" }, { "ｾ", "セ" }, { "ｿ", "ソ" },
        { "ﾀ", "タ" }, { "ﾁ", "チ" }, { "ﾂ", "ツ" }, { "ﾃ", "テ" }, { "ﾄ", "ト" },
        { "ﾅ", "ナ" }, { "ﾆ", "ニ" }, { "ﾇ", "ヌ" }, { "ﾈ", "ネ" }, { "ﾉ", "ノ" },
        { "ﾊ", "ハ" }, { "ﾋ", "ヒ" }, { "ﾌ", "フ" }, { "ﾍ", "ヘ" }, { "ﾎ", "ホ" },
        { "ﾏ", "マ" }, { "ﾐ", "ミ" }, { "ﾑ", "ム" }, { "ﾒ", "メ" }, { "ﾓ", "モ" },
        { "ﾔ", "ヤ" }, { "ﾕ", "ユ" }, { "ﾖ", "ヨ" },
        { "ﾗ", "ラ" }, { "ﾘ", "リ" }, { "ﾙ", "ル" }, { "ﾚ", "レ" }, { "ﾛ", "ロ" },
        { "ﾜ", "ワ" }, { "ｦ", "ヲ" }, { "ﾝ", "ン" },
        { "ｧ", "ァ" }, { "ｨ", "ィ" }, { "ｩ", "ゥ" }, { "ｪ", "ェ" }, { "ｫ", "ォ" },
        { "ｬ", "ャ" }, { "ｭ", "ュ" }, { "ｮ", "ョ" }, { "ｯ", "ッ" },
        { "｡", "。" }, { "｢", "「" }, { "｣", "」" }, { "､", "、" }, { "･", "・" },
        { "ｰ", "ー" }, { "", "" }
    };
    /**
    * 全角→半角に変換する（英字、数字、記号、カタカナ）
    *
    * @param  対象文字列
    * @return 変換後文字列
    */
    public static String convZenkakuToHankaku(String s){
        String convStr;

        /** 英字、数字、記号 */
        convStr = convZenkakuLatinCharToHankakuLatinChar(s);

        /** カタカナ */
        convStr = convZenkakuKatakanaToHankakuKatakana(convStr);

        return convStr;
    }
    /**
    * 全角ラテン基本文字→半角ラテン基本文字に変換する <br />
    *
    * ラテン基本文字（英字、数字、記号）
    *
    * @param  対象文字列
    * @return 変換後文字列
    */
    public static String convZenkakuLatinCharToHankakuLatinChar(String s){
        String str = "";

        /** パラメータの文字列を先頭から1文字づつ調べる */
        for (int i = 0; i < s.length(); i++) {
            /** 文字列から１文字取り出します */
            Character c = new Character(s.substring(i, i + 1).charAt(0));

            /** Unicode全角ラテン文字のコード範囲(！から～)であるか調べる */
            if (c.compareTo(new Character((char)0xff01)) >= 0 && c.compareTo(new Character((char)0xff5e)) <= 0) {
                /** 変換文字から0xfee0を減算して半角文字に変換 */
                Character x = new Character((char) (c.charValue() - (new Character((char)0xfee0)).charValue()));

                /** 文字列としてセット */
                str = str + x.toString();
            } else {
                /** 全角ラテン文字以外はそのままセット */
                str = str + s.substring(i, i + 1);
            }
        }

        /** 変換後文字列を返す */
        return str;
    }
    /**
    * 全角カタカナ→半角カタカナに変換する
    *
    * @param  対象文字列
    * @return 変換後文字列
    */
    public static String convZenkakuKatakanaToHankakuKatakana(String s) {
        String str = "";

        /** パラメータの文字列を先頭から1文字づつ調べる */
        for (int i = 0, j = 0; i < s.length(); i++) {
            /** 文字列から１文字取り出す */
            Character c = new Character(s.substring(i, i + 1).charAt(0));

            /** Unicode全角カタカナのコード範囲か調べる */
            if (c.compareTo(new Character((char)0x30a1)) >= 0 && c.compareTo(new Character((char)0x30fc)) <= 0) {
                /** 半角全角変換テーブルから対応する半角カナを取得して戻り文字列へセット */
                for (j = 0; j < kanaHanZenTbl.length; j++) {
                    if (s.substring(i).startsWith(kanaHanZenTbl[j][1])) {
                        str = str + kanaHanZenTbl[j][0];
                        break;
                    }
                }

                /** 半角全角変換テーブルにマッチするエントリがなければそのままセット */
                if (j >= kanaHanZenTbl.length) {
                    str = str + s.substring(i, i + 1);
                }
            } else {
                /** 全角カタカナ以外はそのままセット */
                str = str + s.substring(i, i + 1);
            }
        }

        /** 変換後文字列を返す */
        return str;
    }
    /**
     * 引数の文字列(UTF-8)を、Shift_JISにエンコードする。
     * @param value 変換対象の文字列
     * @return エンコードされた文字列
     */
    public static String utf8ToSjis(String value)  {
        try {
            /* Sjisにすると文字化けするUnicodeにも対応する。*/
            if(value != null) {
                StringBuffer sb = new StringBuffer();
                for(char c: value.toCharArray()) {
                    sb.append(unicodeToSjis(Character.toString(c)));
                }
                value = sb.toString();
            }
            boolean[] boolAry = new boolean[value.length()];
            byte[] srcStream = value.getBytes("UTF-8");
            value = convert(new String(srcStream, "UTF-8"), "UTF-8", "SJIS");
            boolAry = getQuePos(boolAry,value);
            byte[] destStream = value.getBytes("SJIS");
            value = new String(destStream, "SJIS");
            value = convertGeta(value,boolAry);
            return value;
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }
    /**
    * 文字列中の「?」の位置を取得する。
    *
    * @param value 変換対象の文字列
    * @return boolAry 文字列中の「?」の位置
    */
    private static boolean[] getQuePos(boolean[] boolAry, String value) {
        for (int i = 0; i < value.length(); i++) {
            if (value.substring(i, i + 1).equals("?")) {
                boolAry[i] = true;
            } else {
                boolAry[i] = false;
            }
        }
        return boolAry;
    }
    /**
     * 文字化け「?」を代用文字「〓」に変換する。
     *
     * @param value 変換対象の文字列
     * @param bAry 変換する文字位置
     * @return newVal 変換後の文字列
     */
    private static String convertGeta(String value, boolean[] bAry) {
        String newVal = "";
        String c = "";
        for (int i = 0; i < value.length(); i++) {
            c = value.substring(i, i + 1);
            if (bAry[i] == false) {
                if (c.equals("?")) {
                    c = "〓";
                }
            }
            newVal = newVal + c;
        }
        return newVal;
    }
    /**
     * 引数の文字列を、エンコードする。
     *
     * @param value 変換対象の文字列
     * @param src 変換前の文字コード
     * @param dest 変換後の文字コード
     * @return エンコードされた文字列
     */
    private static String convert(String value, String src, String dest) {
        Map<String, String> conversion = createConversionMap(src, dest);
        char oldChar;
        char newChar;
        String key;
        for (Iterator<String> itr = conversion.keySet().iterator(); itr.hasNext();) {
            key = itr.next();
            oldChar = toChar(key);
            newChar = toChar(conversion.get(key));
            value = value.replace(oldChar, newChar);
        }
        return value;
    }
    /**
     * エンコード情報を作成する
     *
     * @param src 変換前の文字コード
     * @param dest 変換後の文字コード
     * @return エンコードされた文字列
     */
    private static Map<String, String> createConversionMap(String src, String dest) {
        Map<String, String> conversion = new HashMap<String, String>();
        if ((src.equals("UTF-8")) && (dest.equals("SJIS"))) {
            // －（全角マイナス）
            conversion.put("U+FF0D", "U+2212");
            // ～（全角チルダ）
            conversion.put("U+FF5E", "U+301C");
            // ￠（セント）
            conversion.put("U+FFE0", "U+00A2");
            // ￡（ポンド）
            conversion.put("U+FFE1", "U+00A3");
            // ￢（ノット）
            conversion.put("U+FFE2", "U+00AC");
            // ―（全角マイナスより少し幅のある文字）
            conversion.put("U+2015", "U+2014");
            // ∥（半角パイプが2つ並んだような文字）
            conversion.put("U+2225", "U+2016");

        } else if ((src.equals("SJIS")) && (dest.equals("UTF-8"))) {
            // －（全角マイナス）
            conversion.put("U+2212", "U+FF0D");
            // ～（全角チルダ）
            conversion.put("U+301C", "U+FF5E");
            // ￠（セント）
            conversion.put("U+00A2", "U+FFE0");
            // ￡（ポンド）
            conversion.put("U+00A3", "U+FFE1");
            // ￢（ノット）
            conversion.put("U+00AC", "U+FFE2");
            // ―（全角マイナスより少し幅のある文字）
            conversion.put("U+2014", "U+2015");
            // ∥（半角パイプが2つ並んだような文字）
            conversion.put("U+2016", "U+2225");

        } else {
            throw new RuntimeException("この文字コードはサポートしていません。\n・src=" + src + ",dest=" + dest);
        }
        return conversion;
    }

    /**
    * 16進表記の文字を取得する。
    *
    * @param value 変換対象の文字列
    * @return 16進表記の文字
    */
    private static char toChar(String value) {
        return (char) Integer.parseInt(value.trim().substring("U+".length()), 16);
    }
    
    
    /** Sjisにすると文字化けするUnicodeにも対応する。*/
    public static String unicodeToSjis(String value) {
        if(value == null || value.length() != 1) {
            return value;
        }
        char decodeStr;

        int code = (int)value.charAt(0);
        String hex = Integer.toHexString(code);
        hex = "u" + hex.toUpperCase();

        if (hex.equals("u3299")==true) { decodeStr = Character.valueOf('\u79D8');} //㊙(?)→秘(秘)
        else if (hex.equals("u4EFD")==true) { decodeStr = Character.valueOf('\u5F6C');} //份(?)→彬(彬)
        else if (hex.equals("u4FE0")==true) { decodeStr = Character.valueOf('\u4FA0');} //俠(?)→侠(侠)
        else if (hex.equals("u4FE0")==true) { decodeStr = Character.valueOf('\u4FA0');} //俠(?)→侠(侠)
        else if (hex.equals("u501C")==true) { decodeStr = Character.valueOf('\u4FF6');} //倜(?)→俶(俶)
        else if (hex.equals("u502E")==true) { decodeStr = Character.valueOf('\u88F8');} //倮(?)→裸(裸)
        else if (hex.equals("u5040")==true) { decodeStr = Character.valueOf('\u82F1');} //偀(?)→英(英)
        else if (hex.equals("u5042")==true) { decodeStr = Character.valueOf('\u524D');} //偂(?)→前(前)
        else if (hex.equals("u5070")==true) { decodeStr = Character.valueOf('\u5951');} //偰(?)→契(契)
        else if (hex.equals("u510B")==true) { decodeStr = Character.valueOf('\u62C5');} //儋(?)→担(担)
        else if (hex.equals("u519D")==true) { decodeStr = Character.valueOf('\u5B9C');} //冝(?)→宜(宜)
        else if (hex.equals("u51EE")==true) { decodeStr = Character.valueOf('\u98A8');} //凮(?)→風(風)
        else if (hex.equals("u525D")==true) { decodeStr = Character.valueOf('\u5265');} //剝(?)→剥(剥)
        else if (hex.equals("u525D")==true) { decodeStr = Character.valueOf('\u5265');} //剝(?)→剥(剥)
        else if (hex.equals("u52C8")==true) { decodeStr = Character.valueOf('\u52C7');} //勈(?)→勇(勇)
        else if (hex.equals("u5393")==true) { decodeStr = Character.valueOf('\u5D16');} //厓(?)→崖(崖)
        else if (hex.equals("u5500")==true) { decodeStr = Character.valueOf('\u8A98');} //唀(?)→誘(誘)
        else if (hex.equals("u5511")==true) { decodeStr = Character.valueOf('\u566C');} //唑(?)→噬(噬)
        else if (hex.equals("u555E")==true) { decodeStr = Character.valueOf('\u5516');} //啞(?)→唖(唖)
        else if (hex.equals("u555E")==true) { decodeStr = Character.valueOf('\u5516');} //啞(?)→唖(唖)
        else if (hex.equals("u5649")==true) { decodeStr = Character.valueOf('\u5556');} //噉(?)→啖(啖)
        else if (hex.equals("u5653")==true) { decodeStr = Character.valueOf('\u5618');} //噓(?)→嘘(嘘)
        else if (hex.equals("u5653")==true) { decodeStr = Character.valueOf('\u5618');} //噓(?)→嘘(嘘)
        else if (hex.equals("u5699")==true) { decodeStr = Character.valueOf('\u565B');} //嚙(?)→噛(噛)
        else if (hex.equals("u5699")==true) { decodeStr = Character.valueOf('\u565B');} //嚙(?)→噛(噛)
        else if (hex.equals("u569E")==true) { decodeStr = Character.valueOf('\u54F2');} //嚞(?)→哲(哲)
        else if (hex.equals("u56CA")==true) { decodeStr = Character.valueOf('\u56A2');} //囊(?)→嚢(嚢)
        else if (hex.equals("u56CA")==true) { decodeStr = Character.valueOf('\u56A2');} //囊(?)→嚢(嚢)
        else if (hex.equals("u5723")==true) { decodeStr = Character.valueOf('\u8056');} //圣(?)→聖(聖)
        else if (hex.equals("u57C8")==true) { decodeStr = Character.valueOf('\u5CFB');} //埈(?)→峻(峻)
        else if (hex.equals("u5861")==true) { decodeStr = Character.valueOf('\u586B');} //塡(?)→填(填)
        else if (hex.equals("u5861")==true) { decodeStr = Character.valueOf('\u586B');} //塡(?)→填(填)
        else if (hex.equals("u5AF0")==true) { decodeStr = Character.valueOf('\u5AE9');} //嫰(?)→嫩(嫩)
        else if (hex.equals("u5C1E")==true) { decodeStr = Character.valueOf('\u71CE');} //尞(?)→燎(燎)
        else if (hex.equals("u5C5B")==true) { decodeStr = Character.valueOf('\u5C4F');} //屛(?)→屏(屏)
        else if (hex.equals("u5C5B")==true) { decodeStr = Character.valueOf('\u5C4F');} //屛(?)→屏(屏)
        else if (hex.equals("u5C62")==true) { decodeStr = Character.valueOf('\u5C61');} //屢(?)→屡(屡)
        else if (hex.equals("u5C62")==true) { decodeStr = Character.valueOf('\u5C61');} //屢(?)→屡(屡)
        else if (hex.equals("u5C88")==true) { decodeStr = Character.valueOf('\u8C3A');} //岈(?)→谺(谺)
        else if (hex.equals("u5CBA")==true) { decodeStr = Character.valueOf('\u5DBA');} //岺(?)→嶺(嶺)
        else if (hex.equals("u5FB0")==true) { decodeStr = Character.valueOf('\u5F81');} //徰(?)→征(征)
        else if (hex.equals("u61BC")==true) { decodeStr = Character.valueOf('\u656C');} //憼(?)→敬(敬)
        else if (hex.equals("u6414")==true) { decodeStr = Character.valueOf('\u63BB');} //搔(?)→掻(掻)
        else if (hex.equals("u6414")==true) { decodeStr = Character.valueOf('\u63BB');} //搔(?)→掻(掻)
        else if (hex.equals("u6451")==true) { decodeStr = Character.valueOf('\u63B4');} //摑(?)→掴(掴)
        else if (hex.equals("u6451")==true) { decodeStr = Character.valueOf('\u63B4');} //摑(?)→掴(掴)
        else if (hex.equals("u64E5")==true) { decodeStr = Character.valueOf('\u652C');} //擥(?)→攬(攬)
        else if (hex.equals("u6522")==true) { decodeStr = Character.valueOf('\u6505');} //攢(?)→攅(攅)
        else if (hex.equals("u6522")==true) { decodeStr = Character.valueOf('\u6505');} //攢(?)→攅(攅)
        else if (hex.equals("u658A")==true) { decodeStr = Character.valueOf('\u6589');} //斊(?)→斉(斉)
        else if (hex.equals("u6609")==true) { decodeStr = Character.valueOf('\u70B3');} //昉(?)→炳(炳)
        else if (hex.equals("u6630")==true) { decodeStr = Character.valueOf('\u662F');} //昰(?)→是(是)
        else if (hex.equals("u663B")==true) { decodeStr = Character.valueOf('\u6602');} //昻(?)→昂(昂)
        else if (hex.equals("u663B")==true) { decodeStr = Character.valueOf('\u6602');} //昻(?)→昂(昂)
        else if (hex.equals("u6665")==true) { decodeStr = Character.valueOf('\u7696');} //晥(?)→皖(皖)
        else if (hex.equals("u66FA")==true) { decodeStr = Character.valueOf('\u66F9');} //曺(?)→曹(曹)
        else if (hex.equals("u6702")==true) { decodeStr = Character.valueOf('\u52D7');} //朂(?)→勗(勗)
        else if (hex.equals("u67FA")==true) { decodeStr = Character.valueOf('\u67B4');} //柺(?)→枴(枴)
        else if (hex.equals("u67FA")==true) { decodeStr = Character.valueOf('\u67B4');} //柺(?)→枴(枴)
        else if (hex.equals("u6805")==true) { decodeStr = Character.valueOf('\u67F5');} //栅(?)→柵(柵)
        else if (hex.equals("u6805")==true) { decodeStr = Character.valueOf('\u67F5');} //栅(?)→柵(柵)
        else if (hex.equals("u68A5")==true) { decodeStr = Character.valueOf('\u677E');} //梥(?)→松(松)
        else if (hex.equals("u6A03")==true) { decodeStr = Character.valueOf('\u6994');} //樃(?)→榔(榔)
        else if (hex.equals("u6A03")==true) { decodeStr = Character.valueOf('\u6994');} //樃(?)→榔(榔)
        else if (hex.equals("u6A45")==true) { decodeStr = Character.valueOf('\u6A21');} //橅(?)→模(模)
        else if (hex.equals("u6B56")==true) { decodeStr = Character.valueOf('\u559C');} //歖(?)→喜(喜)
        else if (hex.equals("u6BF1")==true) { decodeStr = Character.valueOf('\u97A0');} //毱(?)→鞠(鞠)
        else if (hex.equals("u6D82")==true) { decodeStr = Character.valueOf('\u5857');} //涂(?)→塗(塗)
        else if (hex.equals("u6F51")==true) { decodeStr = Character.valueOf('\u6E8C');} //潑(?)→溌(溌)
        else if (hex.equals("u6F51")==true) { decodeStr = Character.valueOf('\u6E8C');} //潑(?)→溌(溌)
        else if (hex.equals("u7006")==true) { decodeStr = Character.valueOf('\u6D9C');} //瀆(?)→涜(涜)
        else if (hex.equals("u7006")==true) { decodeStr = Character.valueOf('\u6D9C');} //瀆(?)→涜(涜)
        else if (hex.equals("u705E")==true) { decodeStr = Character.valueOf('\u8987');} //灞(?)→覇(覇)
        else if (hex.equals("u7130")==true) { decodeStr = Character.valueOf('\u7114');} //焰(?)→焔(焔)
        else if (hex.equals("u7130")==true) { decodeStr = Character.valueOf('\u7114');} //焰(?)→焔(焔)
        else if (hex.equals("u7147")==true) { decodeStr = Character.valueOf('\u6689');} //煇(?)→暉(暉)
        else if (hex.equals("u7411")==true) { decodeStr = Character.valueOf('\u7463');} //琑(?)→瑣(瑣)
        else if (hex.equals("u7431")==true) { decodeStr = Character.valueOf('\u5F6B');} //琱(?)→彫(彫)
        else if (hex.equals("u7626")==true) { decodeStr = Character.valueOf('\u75E9');} //瘦(?)→痩(痩)
        else if (hex.equals("u7626")==true) { decodeStr = Character.valueOf('\u75E9');} //瘦(?)→痩(痩)
        else if (hex.equals("u76A6")==true) { decodeStr = Character.valueOf('\u768E');} //皦(?)→皎(皎)
        else if (hex.equals("u7900")==true) { decodeStr = Character.valueOf('\u6F97');} //礀(?)→澗(澗)
        else if (hex.equals("u79B1")==true) { decodeStr = Character.valueOf('\u7977');} //禱(?)→祷(祷)
        else if (hex.equals("u79B1")==true) { decodeStr = Character.valueOf('\u7977');} //禱(?)→祷(祷)
        else if (hex.equals("u7C1E")==true) { decodeStr = Character.valueOf('\u7BAA');} //簞(?)→箪(箪)
        else if (hex.equals("u7C1E")==true) { decodeStr = Character.valueOf('\u7BAA');} //簞(?)→箪(箪)
        else if (hex.equals("u7CB7")==true) { decodeStr = Character.valueOf('\u9EB9');} //粷(?)→麹(麹)
        else if (hex.equals("u7E61")==true) { decodeStr = Character.valueOf('\u7E4D');} //繡(?)→繍(繍)
        else if (hex.equals("u7E61")==true) { decodeStr = Character.valueOf('\u7E4D');} //繡(?)→繍(繍)
        else if (hex.equals("u7E6B")==true) { decodeStr = Character.valueOf('\u7E4B');} //繫(?)→繋(繋)
        else if (hex.equals("u7E6B")==true) { decodeStr = Character.valueOf('\u7E4B');} //繫(?)→繋(繋)
        else if (hex.equals("u80DC")==true) { decodeStr = Character.valueOf('\u52DD');} //胜(?)→勝(勝)
        else if (hex.equals("u8330")==true) { decodeStr = Character.valueOf('\u8438');} //茰(?)→萸(萸)
        else if (hex.equals("u8346")==true) { decodeStr = Character.valueOf('\u834A');} //荆(?)→荊(荊)
        else if (hex.equals("u8346")==true) { decodeStr = Character.valueOf('\u834A');} //荆(?)→荊(荊)
        else if (hex.equals("u840A")==true) { decodeStr = Character.valueOf('\u83B1');} //萊(?)→莱(莱)
        else if (hex.equals("u840A")==true) { decodeStr = Character.valueOf('\u83B1');} //萊(?)→莱(莱)
        else if (hex.equals("u8493")==true) { decodeStr = Character.valueOf('\u84F4');} //蒓(?)→蓴(蓴)
        else if (hex.equals("u8523")==true) { decodeStr = Character.valueOf('\u848B');} //蔣(?)→蒋(蒋)
        else if (hex.equals("u8523")==true) { decodeStr = Character.valueOf('\u848B');} //蔣(?)→蒋(蒋)
        else if (hex.equals("u8610")==true) { decodeStr = Character.valueOf('\u8431');} //蘐(?)→萱(萱)
        else if (hex.equals("u8612")==true) { decodeStr = Character.valueOf('\u8429');} //蘒(?)→萩(萩)
        else if (hex.equals("u87EC")==true) { decodeStr = Character.valueOf('\u8749');} //蟬(?)→蝉(蝉)
        else if (hex.equals("u87EC")==true) { decodeStr = Character.valueOf('\u8749');} //蟬(?)→蝉(蝉)
        else if (hex.equals("u881F")==true) { decodeStr = Character.valueOf('\u874B');} //蠟(?)→蝋(蝋)
        else if (hex.equals("u881F")==true) { decodeStr = Character.valueOf('\u874B');} //蠟(?)→蝋(蝋)
        else if (hex.equals("u88F5")==true) { decodeStr = Character.valueOf('\u88F4');} //裵(?)→裴(裴)
        else if (hex.equals("u8989")==true) { decodeStr = Character.valueOf('\u7F88');} //覉(?)→羈(羈)
        else if (hex.equals("u8990")==true) { decodeStr = Character.valueOf('\u899A');} //覐(?)→覚(覚)
        else if (hex.equals("u8A37")==true) { decodeStr = Character.valueOf('\u4F38');} //訷(?)→伸(伸)
        else if (hex.equals("u8EC0")==true) { decodeStr = Character.valueOf('\u8EAF');} //軀(?)→躯(躯)
        else if (hex.equals("u8EC0")==true) { decodeStr = Character.valueOf('\u8EAF');} //軀(?)→躯(躯)
        else if (hex.equals("u91AC")==true) { decodeStr = Character.valueOf('\u91A4');} //醬(?)→醤(醤)
        else if (hex.equals("u91AC")==true) { decodeStr = Character.valueOf('\u91A4');} //醬(?)→醤(醤)
        else if (hex.equals("u91B1")==true) { decodeStr = Character.valueOf('\u9197');} //醱(?)→醗(醗)
        else if (hex.equals("u91B1")==true) { decodeStr = Character.valueOf('\u9197');} //醱(?)→醗(醗)
        else if (hex.equals("u969D")==true) { decodeStr = Character.valueOf('\u5CF6');} //隝(?)→島(島)
        else if (hex.equals("u974D")==true) { decodeStr = Character.valueOf('\u9DB4');} //靍(?)→鶴(鶴)
        else if (hex.equals("u974E")==true) { decodeStr = Character.valueOf('\u9DB4');} //靎(?)→鶴(鶴)
        else if (hex.equals("u974F")==true) { decodeStr = Character.valueOf('\u9DB4');} //靏(?)→鶴(鶴)
        else if (hex.equals("u982B")==true) { decodeStr = Character.valueOf('\u4FEF');} //頫(?)→俯(俯)
        else if (hex.equals("u9830")==true) { decodeStr = Character.valueOf('\u982C');} //頰(?)→頬(頬)
        else if (hex.equals("u9830")==true) { decodeStr = Character.valueOf('\u982C');} //頰(?)→頬(頬)
        else if (hex.equals("u985A")==true) { decodeStr = Character.valueOf('\u985B');} //顚(?)→顛(顛)
        else if (hex.equals("u985A")==true) { decodeStr = Character.valueOf('\u985B');} //顚(?)→顛(顛)
        else if (hex.equals("u9A52")==true) { decodeStr = Character.valueOf('\u9A28');} //驒(?)→騨(騨)
        else if (hex.equals("u9A52")==true) { decodeStr = Character.valueOf('\u9A28');} //驒(?)→騨(騨)
        else if (hex.equals("u9DD7")==true) { decodeStr = Character.valueOf('\u9D0E');} //鷗(?)→鴎(鴎)
        else if (hex.equals("u9DD7")==true) { decodeStr = Character.valueOf('\u9D0E');} //鷗(?)→鴎(鴎)
        else if (hex.equals("u9E7C")==true) { decodeStr = Character.valueOf('\u9E78');} //鹼(?)→鹸(鹸)
        else if (hex.equals("u9E7C")==true) { decodeStr = Character.valueOf('\u9E78');} //鹼(?)→鹸(鹸)
        else if (hex.equals("u9EB4")==true) { decodeStr = Character.valueOf('\u9EB9');} //麴(?)→麹(麹)
        else if (hex.equals("u9EB4")==true) { decodeStr = Character.valueOf('\u9EB9');} //麴(?)→麹(麹)
        else if (hex.equals("u9EB5")==true) { decodeStr = Character.valueOf('\u9EBA');} //麵(?)→麺(麺)
        else if (hex.equals("u9EB5")==true) { decodeStr = Character.valueOf('\u9EBA');} //麵(?)→麺(麺)
        else if (hex.equals("u9FA2")==true) { decodeStr = Character.valueOf('\u548C');} //龢(?)→和(和)
        else {
            decodeStr = value.charAt(0);
        }
        return Character.toString(decodeStr);
    }
}
