こんにちは。「Javaを復習する初心者」です。
今回はカタカナを平仮名に変換するということをやりました。
動機
StringにはequalsIgnoreCaseメソッドというメソッドがあります。このメソッドはアルファベットの大文字と小文字を区別せずに、このStringを別のStringと比較します。これの平仮名カタカタ版を作ってみました。その際に必要になるのが、カタカナを平仮名に変換することです。
変換処理
文字コードUTF-16ではほとんどのカタカナを平仮名へ単純に変換することができます。「ヴ」、「ヵ」、「ヶ」は調べた結果、対応する平仮名が内容です。それ以外は文字コードの引き算で平仮名に変換できます。実際の式は単純で、カタカナ「c」に対して、「c-0x0060」をするだけです。16進数で0x0060の分だけ並びがずれているということです。
以下はカタカナを平仮名にするメソッドです。
変換メソッド
private String getHiraFrom(String s) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (0x30A1 <= c && c <= 0x30F3) {
c -= 0x0060;
}
sb.append(c);
}
return sb.toString();
}
引数の文字列に対し、i番目の文字を取り出します。文字コードが0x30A1~0x30F3の場合、0x0060を引きます。文字コード0x30A1は「ァ」、0x30F3は「ン」を表します。平仮名は0x3041~0x3093の範囲にあります。ちょうど差が0x0060になっていますので、引いてます。後はStringBuilderに追加していくだけです。最後にStringBuilderをStringに直したものを返却しています。
上記メソッドとString#compareToを使って、比較メソッドを以下のように定義しました。
比較メソッド
public int compareIgnoreHiraKata(String s1, String s2) {
return getHiraFrom(s1).compareTo(getHiraFrom(s2));
}
文字コードとして差がなければ0が返却されます。
テスト
以下、テストコードと結果です。
テスト
public void test() {
show("あ", "あ");
show("あ", "ア");
show("あ", "を");
show("あ", "ヲ");
show("いろは", "イロハ");
show("いロハ", "いロハ");
}
public void show(String s1, String s2) {
System.out.println(
String.format(
"%s, %s: %2d",
s1, s2, compareIgnoreHiraKata(s1, s2)));
}
結果
あ, あ: 0
あ, ア: 0
あ, を: -80
あ, ヲ: -80
いろは, イロハ: 0
いロハ, いロハ: 0
「あ」と「ア」の比較結果が0です。変換ができているということです。