5

NSString で絵文字を走査する方法 NSString の部分文字列を走査するために使用される NSString メソッドがあります。

    NSString *text = @"2012我们 ";
    [text enumerateSubstringsInRange:NSMakeRange(0, [text length]) options:NSStringEnumerationByComposedCharacterSequences  usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
    printf("%s- ",[substring UTF8String]);
}];

出力は何だと思いますか?

出力は次のとおりです。

    2- 0- 1- 2- - 我- 们-  - - - - - - - - - - - -  - - 

それよりも:

   2- 0- 1- 2- - 我- 们-  - - - - - - - - - - 

アメリカの国旗と同じように と で構成されています。NSStringが列挙されている間、それは私に与えるのではなく

文字列がUITextViewにある場合、キーボードのBACKSPACEをタップすると、絵文字ではなく絵文字を削除するように処理できます。

私のアプリでは、カスタム絵文字キーボードを作成し、DELETE ボタンがあります。DELETE ボタンは、キーボードのシステムの BACKSPACE ボタンと同じように機能します。

誰もそれを処理する方法を知っていますか?

4

4 に答える 4

15

UITextView の最後の文字を削除するには、単に呼び出します-deleteBackward

- (void)deleteButtonPressed:(id)sender
  {
     [self.textView deleteBackward];
  }
于 2012-08-01T05:59:03.553 に答える
2

私は Unicode の専門家ではありませんが、ここでの問題は、フラグが実際には 2 文字であることだと思います。それらは地域の指標記号です。たとえば、アメリカの国旗は と の 2 つの異なる文字REGIONAL INDICATOR SYMBOL LETTER UですREGIONAL INDICATOR SYMBOL LETTER S

http://en.wikipedia.org/wiki/Regional_Indicator_Symbol

テキスト入力システムにトークン化を依頼するのは運がいいかもしれません。トークン化は (たとえば、削除するとき) 1 つの単位として扱われるべきであることを理解しているようです。UITextInputTokenizerメソッドpositionFromPosition:toBoundary:inDirection:を使用して、文字列の末尾から前の文字に移動してみてください(つまり、 pass UITextGranularityCharacter)。UITextView または UITextArea のtokenizerメソッドからトークナイザーを取得できます。

それが役立つことを願っています!

于 2012-07-31T23:54:16.447 に答える
1

以下はJesse Rusakの提案に基づく解決策ですが、もちろんエラーが私の側にない限り、UITextInputTokenizerでさえテキストを適切に解析できないようです:)

+(void)parse:(UITextField *)textfield {
    id<UITextInputTokenizer> tokenizer = [textfield tokenizer];
    UITextPosition *pos = textfield.beginningOfDocument;

    while (true) {
        UITextRange *range = [tokenizer rangeEnclosingPosition:pos withGranularity:UITextGranularityCharacter inDirection:UITextStorageDirectionForward];
        NSString *oneCharacter = [textfield textInRange:range];

        NSLog( @"%@", oneCharacter );

        pos = [textfield positionFromPosition:pos offset:-1];

        if (pos == nil) break;
    }
}
于 2014-07-30T18:15:35.073 に答える
0

誰かが現代でこれに遭遇した場合、問題は iOS 10 以前で修正されていることを知っておいてください。次の Swift プレイグラウンド コードは、フラグ (地域インジケーター シンボルのペア) を正しく出力するようになりました。

import Foundation

var str = "2017我们"

str.enumerateSubstrings(in: str.startIndex..<str.endIndex, options: .byComposedCharacterSequences) { (substr, range, enclRange, stop) in
    print(substr!)
}
于 2017-06-23T13:59:04.040 に答える