韓国のアプリでは、最初の文字だけから intellisense を使用するのは正常な動作ではないと思います。通常は完全な Jamo で行われるようです。ただし、それを行うべきではない理由はわかりません。それで、やりましょう。
まず、あなたは二重のイニシャルを見逃しました。これらは、別のキーを押す必要があるため (通常はシフト + 文字)、シングルとは異なります。とにかく、イニシャルのリストは次のとおりです。
ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ
イニシャルが入力されたときに最初に行う必要があるのは、その特定のイニシャルで始まる文字の範囲を取得することです。
Windows Character Map を見ると、最初の文字 Ka (가) が Unicode ポイント0xAC00
(または 10 進数44032
) にあることがわかります。そのため、任意の範囲を取得するには、この値を計算に追加する必要があります。したがって、FirstLetter
または何かと呼ばれる定数が必要であり、その値は44032
.
까 は at 0xAE4C
(または decimal 44620
) であるため、乗数 (つまり、特定のイニシャルで始まる文字数) が得られます。44620-44032
これはすべてのイニシャルで同じです588
。
これで、IntelliSense を実装するのに十分な情報が得られました。配列に頭文字がある場合、その配列で入力された文字のインデックスを使用して、それで始まる文字の範囲を見つけることができます。
したがって、ㄱ から始めると、もちろん、가 から 깋 までのすべてが返されます。それらのすべての588。ㄱは「0」を与えるので、
startCodePoint = index * 588 + 44032
// = 0 * 588 + 44032 == 44032 == 가
endCodePoint = (index + 1) * 588 + 44032
// this will include 까
そして、特定の文字が「ㄱ」で始まることを確認することができます
if(charcode >= startCodePoint && charcode < endCodePoint) { ... }
はcharcode
、Intellisense リスト内の項目の 1 つの最初の文字です。
同様の方法を使用して、文字が「가」で始まることを確認する方法を見つけます。すべてが Unicode で整然としているため、これは非常に単純な作業です。
任意の文字の頭文字を取得するには、上記の式を逆に使用できます。
すなわち
- 最初の文字の Unicode 値を取得します (例: 각)
- この値から 44032 を引きます。
- この値を 588 で割ります。
- その値をインデックスとして使用して、イニシャルのリストから最初の文字を取得します。
例えば
String initials = "ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ";
int value = character.codePointAt(0);
value = (value - 44032) / 588;
String initial = initials.substring(value, 1);