[Java] 全角半角変換(英数字の場合) | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

何かと利用する機会も多そうなのでメモしておきます。

英数字に関しては、全角半角でコードの並び順が一致しているため、文字コードの加減算で実現できるようです。

つまり、半角→全角の場合は 0xFEE0 を加算、全角→半角の場合は 0xFEE0 を減算すれば OK ということになります。


なお、英数字以外の文字種については、必ずしも全角半角でコードの並び順が一致しているわけではないので、英数字のように単純には変換できません。

したがって、それらの文字種について誤った変換がなされないよう、変換前には変換対象とするコード範囲を絞り込んでおく必要があります。

文字種 コード範囲
数字(半角) 0x30~0x39
英字(半角/大文字) 0x41~0x5A
英字(半角/小文字) 0x61~0x7A
数字(全角) 0xFF10~0xFF19
英字(全角/大文字) 0xFF21~0xFF3A
英字(全角/小文字) 0xFF41~0xFF5A

半角英数字を全角英数字に変換する
private static String hankakuToZenkaku(String value) {
    StringBuilder sb = new StringBuilder(value);
    for (int i = 0; i < sb.length(); i++) {
        int c = (int) sb.charAt(i);
        if ((c >= 0x30 && c <= 0x39) || (c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A)) {
            sb.setCharAt(i, (char) (c + 0xFEE0));
        }
    }
    value = sb.toString();
    return value;
}

全角英数字を半角英数字に変換する
private static String zenkakuToHankaku(String value) {
    StringBuilder sb = new StringBuilder(value);
    for (int i = 0; i &lt; sb.length(); i++) {
        int c = (int) sb.charAt(i);
        if ((c >= 0xFF10 && c <= 0xFF19) || (c >= 0xFF21 && c <= 0xFF3A) || (c >= 0xFF41 && c <= 0xFF5A)) {
            sb.setCharAt(i, (char) (c - 0xFEE0));
        }
    }
    value = sb.toString();
    return value;
}