2017-12-17 18 views
0

私はカスタムキーボードで作業しており、文字を削除するのにdeleteSurroundingTextを使用しています。私はこれに2つの問題があります。 deleteSurroundingTextは、emojisの削除中はうまく機能しません。私はdelボタンを2回押して、単一の絵文字を取り除く必要があります。また、delのキーはselect allオプションでは機能しません。 ?deleteSurroundingTextがemojisで動作せず、すべてを選択するのはなぜですか?

それは疑問符に変わる:

case Keyboard.KEYCODE_DELETE: 
    getCurrentInputConnection().deleteSurroundingText(1,0); 
    break; 

これは私がデル絵文字にしようと押すと、絵文字ために何が起こるかです。 また、select allを実行してテキストを削除しようとすると、何も起こりません。

すべてのヘルプは

答えて

0

Javaは(ドキュメントのnoteを参照してください)16ビット文字を使用していただければ幸いです。したがって、1文字はU+0000からU+FFFFまでのコードポイントを格納できます。
最新のユニコード定義コードポイントの範囲はU+0000からU+10FFFFです。 emojisのほとんどはコードポイントがU+FFFFを超えています。そのようなコードポイントを表すために、いわゆる「surrogate pairs」が使用されています。
つまり、各絵文字(およびU+FFFF境界を超える他のすべてのコードポイント)は2文字の文字列にという結果文字で表されます。
deleteSurroundingText(1,0);に電話すると、サロゲートペアが破損します。サロゲートペアのまだ削除されていない部分は、?マークとしてレンダリングされます。 deleteSurroundingText()ため

ドキュメントは、特別にこのケースを強調する:

IMEの作者:サロゲートペアの半分だけを削除しないように注意してください。また、アプリケーションに悪影響を与える可能性があるので、エディタにある文字よりも多くの文字を削除しないように注意してください。このメソッドを呼び出すと、バッチインプットが終了した後に、エディタがサービスのonUpdateSelection(int、int、int、int、int、int)を呼び出すようになります。

次回は、使用する前にメソッドのドキュメントをよくお読みください。

文字がサロゲートペアの一部であるかどうかを確認するには、Chracter::isSurrogate()メソッドを使用します。

+0

ありがとうございました:) – Meimo

関連する問題