OBONO’s Diary

へっぽこプログラマの戯言

InputFilter

ちょっと必要になって、アルファベット小文字を大文字に、且つ全角カタカナをひらがなに変換するInputFilterを実装した。

    public static class CustomFilter implements InputFilter {

        static final char HIRAGANA_SMALL_A      = 0x3041;
        static final char HIRAGANA_DIGRAPH_YORI = 0x309F;
        static final char KATAKANA_SMALL_A      = 0x30A1;
        static final char KATAKANA_NN           = 0x30F3;
        static final char KATAKANA_PROLONGED    = 0x30FC;

        public CharSequence filter(CharSequence source, int start, int end,
                    Spanned dest, int dstart, int dend) {
            for (int i = start; i < end; i++) {
                char c = source.charAt(i);
                if (Character.isLowerCase(c) || c >= HIRAGANA_SMALL_A) {
                    char[] v = new char[end - start];
                    TextUtils.getChars(source, start, end, v, 0);
                    String s = convertKana(new String(v).toUpperCase());
                    if (source instanceof Spanned) {
                        SpannableString sp = new SpannableString(s);
                        TextUtils.copySpansFrom((Spanned) source, start, end, null, sp, 0);
                        return sp;
                    } else {
                        return s;
                    }
                }
            }
            return null; // keep original
        }

        public static String convertKana(String s) {
            StringBuffer sb = new StringBuffer(s);
            for (int i = 0; i < sb.length(); i++) {
                char c = sb.charAt(i);
                if (c >= KATAKANA_SMALL_A && c <= KATAKANA_NN) {
                    sb.setCharAt(i, (char)(c - KATAKANA_SMALL_A + HIRAGANA_SMALL_A));
                } else if (c > HIRAGANA_DIGRAPH_YORI && c != KATAKANA_PROLONGED) {
                    sb.deleteCharAt(i--);
                }
            }
            return sb.toString();
        }
    }

参考:
EditableとInputFilter - Kazzzの日記
ひらがなとカナ変換 - Javaについて