英数字に関しては、全角半角でコードの並び順が一致しているため、文字コードの加減算で実現できるようです。
つまり、半角→全角の場合は 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 < 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; }