iPhone アプリで韓国語のテキストを表示しようとしています。アプリは文字の Unicode を 1 つずつ NSMutableString に追加し、各文字が追加された後に画面に文字列を表示します。
文字のつなぎ方(Jamo)にはいくつかのルールがあることは理解しています。
これらすべての規則を文字列に自動的に適用する機能はありますか、それとも変更を加えるコードを書く必要がありますか (たとえば、子音の前に母音がある場合、子音を末尾の子音に変更するなど)?
iPhone アプリで韓国語のテキストを表示しようとしています。アプリは文字の Unicode を 1 つずつ NSMutableString に追加し、各文字が追加された後に画面に文字列を表示します。
文字のつなぎ方(Jamo)にはいくつかのルールがあることは理解しています。
これらすべての規則を文字列に自動的に適用する機能はありますか、それとも変更を加えるコードを書く必要がありますか (たとえば、子音の前に母音がある場合、子音を末尾の子音に変更するなど)?
FCA。私にメールを送ったのはあなたですよね?より詳細な質問がここにあるので、あなたのメールに返信する代わりに、ここで答えるように (最善を尽くします)。
あなたと他の人がここに書いた文章全体を読んで、あなたが韓国語の手書き認識ソフトウェアを作っていることがわかりました。したがって、Apple が提供する韓国語の入力方法の贅沢を楽しむことはできません。
言いたいことは2つあります。一つ一つ行きましょう。(これから説明する 2 つのことのうちの 1 つについては、すでにご存じだと思います。)
ハングル文字の作り方。
したがって、お問い合わせを読んで、それは Unicode で構成された/分解された韓国語の文字列 (または一連の Ja (子音) と Mo (母音) だけ) に関するものではないはずです。あなたの質問は、「ユーザーが書いた子音(あなたの言葉は尾子音ですよね?)が最後の子音なのか、次の音節の最初の子音なのかを判断する方法についてのようです。韓国語を学ぶのが最善ですが、簡単に説明させてください。それ。
소방차 (消防署の車) と書いたとしましょう。 ㅅㅗㅂㅏㅇㅊㅏ (繰り返しますが、Unicode の分解された形式について話しているのではありません。それは、人々が韓国語のテキストをどのように書くかについてです。)
ㅗ (2 番目の文字) を入力すると、表示システムは一時的にㅗを前のㅅに付けて 소 を表示します。そして、韓国語のテーブルを検索します。(ハングルの組み立て方は複合スタイルと呼ばれる JoHap スタイル (조합형) ですが、Wansung スタイル (완성형) と呼ばれる任意の韓国語標準で定義された許可された韓国語テキストのテーブルがあります)。そのような音節があるかどうかを確認するテーブル)。すると、表に「소」が見つかります。したがって、「소」と表示されます。
これで次の文字「ㅂ」が書かれました。すると、ここで少し複雑になります。表に「솝」という音節があるので、まず前の音節にㅂをつけます。したがって、「솝」と表示されます。しかし、物事はまだ完全には決まっていません。ユーザーは次の文字「ㅏ」を書き込みます。最初/最初の子音 (Ja) のない音節がないことはほぼ確実です。テーブルを検索しますが、音節 "ㅏ" が見つかりません。
したがって、前の音節に付いているㅂ (ㅅから編集。タイプミス) が実際には 2 番目の音節に属していると推測します。そして、「소바」と表示されるはずです。今、ㅇを打ちました。次に、ㅇを 2 番目の音節に付けようとします。したがって、소방と表示されます。(この時点で、テーブルで 방 を検索することもできます。そして、見つかりました。)
ここで「ㅊ」と打ちます。おそらく、内部的には、바の下にoとㅊが存在する場合、소방ㅊをテストできます(바のように、oとㅊが一緒に存在する音節がないため、書くことはできません)。しかし、そのような音節はありません。したがって、ㅊが次の音節に属すると即座に判断します。
次に「ㅏ」と入力します。ㅊとㅏを組み合わせて차を作ります。スペース キー、リターン キー、またはその他の空白キーを押すと、ハングルの作成が終了します。
これは単純なケースです。韓国語には、빨、꼭、헗などのより複雑な音節があります。最初の子音である복자음 (BokJaUm、二重子音) は、빨 と 꼭 のㅃ、ㄲのように、Shift キーを押しながら ㅂ と ㅅ を入力します。ㅃとㄲが表示されます。そのため、ユーザーがキーボードで入力すると、どのように子音を拾い、それがどこ (前の音節または次の音節) に属しているかを判断するのが簡単になります。(ただし、Windows と Xterm には、ㅂ を 2 回入力してㅃにすることができる便利な韓国語の入力方法がいくつかあります。これは一種のインテリジェントな機能です。しかし、빱빠라빱、흙을 のようなテキストのテストは、最終的にテストすることになるため、複雑になる可能性があります。 {1,3}、{2,2}、{3, 1} のようにグループ化された 3 つまたは 4 つの子音。
悪いニュースは... 手書き認識を書いているので、認識されたハングル文字を 1 つずつ韓国語入力メソッド エンジンに入力すると、そのような複雑なケースを処理する必要がある場合があります。ただし、アプリに独自のインプット メソッドを作成すると、独自のステート マシンを維持できるため、より簡単になります。しかし、ご覧のとおり、これはトレードオフです。既存のインプット メソッド エンジンに応じて、各 char をそこに取り込みます。(うーん…ちょっと待って…インプットメソッドエンジンならそういう複雑なケースも扱えるかも…)
参考までに、2 つのオープンソース プロジェクトを紹介したいと思います。1 つはMac 用の韓国語インプット メソッド Finder モジュールで、もう 1 つは韓国語のインプット メソッドを作成できるインプット メソッド エンジンです。また、ここでホストされている X-Windows 用の韓国語入力メソッドもあります。Windows プロジェクトの検索を希望する場合は、次の.
後者の 2 つは、韓国のオープン ソース プロジェクト ホスティング サイトである KLDP.net でホストされていましたが、Google コードに移動されました。私が覚えている限りでは、「さえなる」と「なび」(蝶) は、同じ子音を 2 回入力して二重子音にすることをサポートしています。
より詳細な情報については、libhangul と nabi を参照してください。(コードのインプットメソッド部分は以前は libhangul と nabi でほぼ同じだったと記憶していますが、当時は分離されており、独立して進化することが期待されていました。
わかった。最初のことは完了です。
では、第二の問題に移りましょう。(これは、すでに知っているかもしれないと私が言った部分です。しかし、私の説明を完了するために、これについても説明させてください。)
それは、おそらく韓国語の入力メソッド ステート マシンまたは libhangul のようなエンジンへの入力として、どの文字を選択するかについてです。構成された (表示されている) ハングル文字には、基本的に構成済みと分解済みの 2 つの表現があります。構成されたものには、完全に構成された文字が含まれます。たとえば、사랑합니다の各音節、사、랑、합、니、다はそのまま保存されます。ㅅ、ㅏ、ㄹ、ㅏ、ㅇ、ㅎ、ㅏ、ㅂ、ㄴ、ㅣ、ㄷ、ㅏとして保存されません。それが Unicode での合成表現です。この表現は、通常、テキスト エディタなどで使用されます。もう 1 つの表現は、Unicode で分解されます。ㅅ、ㅏ、ㄹ、ㅏ、ㅇ、ㅎ、ㅏ、ㅂ、ㄴ、ㅣ、ㄷ、ㅏのようです。
この表現は通常、ファイル システムで使用されます。例えば、Windowsではハングルでファイル名を入れて、Macからそのファイルを含むフォルダにアクセスすると、Windowsでは사랑합니다と表示されますが、ㅅㅏㄹㅏㅇㅎㅏㅂㄴㅣㄷㅏと表示されます。
ただし、記憶が正しければ、ハングルの子音と母音のリストにすぎない別の文字セットがあります。音節が分解されたように見えますが、実際には文字が描かれている空間の真ん中に描かれているという点で異なります。その目的は、教育目的 (またはその他の目的) でハングル文字を韓国語のアルファベット表またはそのようなものに表示することです。
したがって、どの文字 (つまり、分解された文字、またはハングルの子音と母音のリストの文字) を選択または実装するインプット メソッド ステート マシンまたはインプット メソッド エンジンに取り込むかはわかりません。実装する場合は任意ですが、エンジンに外部ライブラリを使用する場合は、それを理解する必要があります。
また、ブログ投稿で述べたように、合成表現と分解表現にはそれぞれ 2 つのバリアントがあり、これらはすべて Unicode 標準で定義されています。ええ、ええ、同意します。かなりの手間です。
私に関して言えば、Mac 用のインプット メソッドを作成しようとしましたが (Apple がセキュリティ上の問題から Finder プラグイン アーキテクチャを取り除くと発表したとき)、そのとき libhangul (ええ..私はそれを使用しようとしました) が変更されていました。多くの。なので、安定するまで我慢することにしました。でも、仕事が忙しくて家に帰ると疲れていたので、自分の入力方法が上達しませんでした。そのため、libhangul プロジェクトの状態はこれまでになく良くなっていると思います。ですから、少なくともそれを見てみるのは良いことです。
また、Windows を使用していない場合は、ハングル入力自体をサポートする hanterm または xterm の派生物を試すとよいでしょう。ソース コードは、ホスティング Web サイトで入手できます。
あなたのプロジェクトがうまくいきますように。他にも聞きたいことがあれば、どうぞ。
libhangul (code.google.com/p/libhangul ) が変換を行います! さまざまなタイプのキーボード (つまり、さまざまなレイアウトのキーボード) を処理し、キーをハングルの Unicode に変換する関数がいくつかあります。また、ハングルを組み合わせて音節を作成する関数もいくつかあります (これらは基本的に、Eonil が応答で言及したテーブル ルックアップを実装しています)。
Libhangul は、ハングルを受信するとバッファに格納します (出力しません)。十分な数のハングルを受け取り、それらを音節に変換した後、音節を出力します。残念ながら、これはユーザーにとって非常に混乱を招きます。これを回避するには、バッファーの内容を画面に表示します。新しいハングルを受け取ったら、表示されていたものを消去する必要があります。音節が正常に形成された場合、音節が表示されます。それ以外の場合は、バッファーの内容が再度表示されます。新しいハングルを画面に表示することはできないことに注意してください。以前に表示したものを消去し、以前のハングルと新しいハングルをバッファーから読み取って、画面に再度表示する必要があります。その理由は、Libhangul がバッファーに格納されている以前のハングルのコードを変更して、それらを新しいハングルと結合できるようにするためです。これにより、最新のハングルが取得されます。
また、ユーザーがカーソルの位置を変更した場合は、バッファーを空にする必要があることに注意してください。さらに、ユーザーがバックスペースを押した場合、画面に最後に表示されたハングルを消去し、バッファから削除する必要があります。Libhangul には、タイプミスを修正するための機能もあります。たとえば、ᅡ と ᄉ を入力すると、사 に変換されます。
JongAm Park と Eonil の助けと思いやりのあるコメントに感謝します! この時点で私の評判は 15 未満なので、あなたの回答に賛成することはできませんが、できるときにします。
これらのシステム レベルのテキスト入力機能を確認してください。私はこれらを使用したことはありませんが、有望に見えます。
iOS はシステム全体のキーボードのカスタマイズをサポートしていないため、誰もがシステムのデフォルトの入力機能を使用するだけです。また、ハングル構成の処理は、オペレーティング システムやプラットフォームごとにすべて異なります。(MS/Apple/Samsung/LG など) 最善の方法は、ユーザーの一貫性を保つために、UITextField などのシステム提供の機能を使用することです。または、プラットフォーム OS の動作を正確にシミュレートする必要があります。もちろん、自分で作ることもできますが、ユーザーは気に入らないでしょう。
私はこのトピック (韓国語のハングル コンポジター) の専門家ではありませんが、テーブル ルックアップのない単純なアルゴリズムはないと思います。とにかく、本当に自分で実装したいのであれば、これらはすべてあなたが処理しなければならない核となる問題です。
それほど難しくはありませんが、とにかく前の文字列を変更する能力が必要です. 同じように見える最初の子音と最後の子音の別のキーを持っていない限り、片方向ストリームのみで韓国語入力を実装することはできません。
Unicode は、Jamo コンポーネントのすべての有効なセットを定義します。通常、これらのコンポーネントはデバイスに表示するには多すぎます。しかも非効率。ほとんどの韓国の入力システムは、これらの Jamo を再度分解し、最終的なゴミを合成する前に一度合成します。韓国人と同じように、視覚的に識別して分解することもできます。
Unicode 標準で定義されている頭文字と末尾の子音と母音を取得した後は、Unicode 正規化機能 ( など-[NSString precomposedStringWithCompatibilityMapping]
) が残りの作業を行います。