6

(#゚Д゚)は5文字です。しかし、iOSでは[@"(#゚Д゚)"の長さ]は7です。

  1. なんで?

  2. または<UITextInput>のテキストを変更するために使用しています。5文字の長さのUITextRangeを作ると、 (# ゚Д゚) をちょうどカバーできます。では、なぜこの (# ゚Д゚) はandでは 5 文字の単語のように見えるのに、NSString では 7 文字の単語のように見えるのでしょうか?UITextFieldUITextViewUITextFieldUITextView

  3. この場合、文字列の正しい長さを取得するにはどうすればよいですか?

4

2 に答える 2

7

1)コメントの多くがすでに述べているように、文字列は5つの構成された文字シーケンス(または必要に応じて文字クラスター)で構成されています。のメソッドunicharのように s で分解すると、メモリ内の文字列を表すのに必要な sの数である 7 が得られます。NSStringlengthunichar

2)どうやらUITextFieldUITextViewは unichar に精通した方法で文字列を処理しています。良いニュースです。あなたもできます。#3を参照してください。

3)NSString合成された文字シーケンスを適切に処理する APIの一部を使用して、合成された文字シーケンスの数を取得できます。私が非常に簡単に作り上げた簡単な例は、小さなNSStringカテゴリです。

@implementation NSString (ComposedCharacterSequences_helper)
-(NSUInteger)numberOfComposedCharacterSequences{
    __block NSUInteger count = 0;
    [self enumerateSubstringsInRange:NSMakeRange(0, self.length)
                             options:NSStringEnumerationByComposedCharacterSequences
                          usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop){
                              NSLog(@"%@",substring); // Just for fun
                              count++;
                          }];
    return count;
}
@end

これも簡単なコードです。しかし、それはあなたが始める必要があります。そして、次のように使用する場合:

NSString *string = @"(# ゚Д゚)";
NSLog(@"string length %i", string.length);
NSLog(@"composed character count %i", [string numberOfComposedCharacterSequences]);

望ましい結果が得られることがわかります。

NSStringAPIの詳細な説明については、WWDC 2012 Session 215 Video "Text and Linguistic Analysis"

于 2013-02-18T04:53:10.453 に答える
1
于 2013-02-18T05:02:52.287 に答える