Javaで業務システムやWebアプリケーションを開発していると、ユーザーが入力したデータに対して「半角英数字を全角英数字に統一したい」という要件が出てくることがあります。例えば、住所の番地や、特定のフォーマットが求められる帳票出力の際などです。
しかし、いざ実装しようとすると、Javaの標準ライブラリには「半角→全角」を一発で変換してくれる便利なメソッドが用意されていません。
そこで今回は、Javaで半角英数字を全角英数字に変換するための、実用的な2つのアプローチをご紹介します。
-
外部ライブラリ「icu4j」を使う方法(おすすめ)
-
自作メソッドで実装する方法
それぞれのサンプルコードと特徴を見ていきましょう。
1. 外部ライブラリ「icu4j」を使う方法(おすすめ)
最も簡単で確実なのが、IBMが開発に関わっている国際化対応ライブラリ「icu4j」を使う方法です。このライブラリには、様々な文字変換機能が含まれており、半角→全角変換も非常にシンプルに実装できます。
Maven依存関係の追加
まずは、プロジェクトに icu4j を導入します。Mavenを使用している場合は、pom.xml に以下の依存関係を追加してください。
|
1 2 3 4 |
<dependency> <groupId>com.ibm.icu</groupId> <artifactId>icu4j</artifactId> <version>73.2</version> </dependency> |
サンプルコード
icu4j を使った変換処理は、驚くほどシンプルです。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import com.ibm.icu.text.Transliterator; public class HalfToFullConverter { public static void main(String[] args) { String halfWidthStr = "Hello World! 12345"; System.out.println("変換前: " + halfWidthStr); // 半角→全角変換のインスタンスを取得 // "Halfwidth-Fullwidth" というIDを指定します Transliterator trans = Transliterator.getInstance("Halfwidth-Fullwidth"); // 変換を実行 String fullWidthStr = trans.transliterate(halfWidthStr); System.out.println("変換後: " + fullWidthStr); } } |
実行結果:
|
1 2 3 |
変換前: Hello World! 12345 変換後: Hello World! 12345 |
解説: Transliterator.getInstance("Halfwidth-Fullwidth") で、半角を全角に変換するための変換器を取得し、transliterate メソッドに文字列を渡すだけです。英数字だけでなく、記号やカタカナなども適切に全角に変換してくれます。非常に強力で便利なライブラリです。
2. 自作メソッドで実装する方法
外部ライブラリを使いたくない場合や、変換対象を「英数字のみ」に限定したい場合などは、自作メソッドで実装することも可能です。
仕組み(Unicodeの差分を利用)
この方法では、文字コード(Unicode)の特性を利用します。 実は、半角英数字と全角英数字のUnicode値には、一定の差分(ズレ)があります。
-
半角文字の「!」(U+0021)から「~」(U+007E)までの範囲
-
全角文字の「!」(U+FF01)から「~」(U+FF5E)までの範囲
この間には、0xFEE0(10進数で65248) という一定の差があります。 つまり、半角文字の文字コードに 0xFEE0 を足してあげれば、対応する全角文字になるのです。(※ただし、半角スペースだけは例外的な位置にあるため、個別対応が必要です)
サンプルコード
以下が、Unicodeの差分を利用した自作変換メソッドの例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
public class HalfToFullSelfMade { public static void main(String[] args) { String halfWidthStr = "Java123 abc"; System.out.println("変換前: " + halfWidthStr); String fullWidthStr = toFullWidth(halfWidthStr); System.out.println("変換後: " + fullWidthStr); } /** * 半角英数字を全角英数字に変換するメソッド * @param s 変換元の文字列 * @return 変換後の文字列 */ public static String toFullWidth(String s) { if (s == null) { return null; } StringBuilder sb = new StringBuilder(s.length()); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); // 半角英数字記号の範囲(0x0021~0x007E)かを判定 if (0x0021 <= c && c <= 0x007E) { // 差分 0xFEE0 を加算して全角に変換 sb.append((char) (c + 0xFEE0)); } // 半角スペース(0x0020)は例外的に個別対応 else if (c == 0x0020) { sb.append((char) 0x3000); // 全角スペース } // それ以外の文字はそのまま追加 else { sb.append(c); } } return sb.toString(); } } |
実行結果:
|
1 2 3 |
変換前: Java123 abc 変換後: Java123 abc |
解説: 文字列を1文字ずつチェックし、対象の半角文字であればUnicode値をずらして全角に変換しています。このコードでは英数字と記号を対象としていますが、if文の条件を変えることで「英数字のみ変換する」といったカスタマイズも可能です。
まとめ
Javaで半角英数字を全角に変換する2つの方法をご紹介しました。
-
手軽に確実に変換したい場合: 外部ライブラリ icu4j がおすすめ。コードが非常にシンプルになります。
-
外部ライブラリへの依存を避けたい場合: 自作メソッドで対応可能。Unicodeの仕組みを理解する必要がありますが、細かい制御が可能です。
プロジェクトの要件や環境に合わせて、最適な方法を選んでみてください。
