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