2013-02-18 10 views
6

(# ゚ Д ゚) ist ein 5-Buchstaben-Wort. Aber in iOS ist [@ "(# ゚ Д ゚)" Länge](# ゚ Д ゚) ist ein 5-Buchstaben-Wort. Aber in iOS ist [@ "(# ゚ Д ゚)" Länge] 7. Warum?

  1. Warum?

  2. Ich verwende <UITextInput>, um den Text in einem UITextField oder UITextView zu ändern. Wenn ich einen UITextRange von 5 Zeichen Länge mache, kann es nur die (# ゚ Д ゚) abdecken. Also, warum das (# ゚ Д ゚) wie ein 5-stelliges Wort in UITextField und UITextView aussieht, aber wie ein 7-stelliges Wort in NSString aussieht ???

  3. Wie bekomme ich in diesem Fall die richtige Länge eines Strings?

+0

Bei einer Schätzung, würde ich Zeichencodierung sagen - zählt NSString Anzahl der Bytes im Vergleich zu Anzahl der Zeichen? vielleicht sind 2 Ihrer Zeichen tatsächlich Multi-Byte-Zeichen, und NSString stolpert ... wie gesagt, das ist eine Schätzung – AndrewP

+0

(# ゚ Д ゚) hat 7 Zeichen, wenn Sie es kopieren und in einen Texteditor einfügen. – Bahamut

+2

Es "sieht" wie ein 6-stelliges Wort aus, weil am Ende ein Leerzeichen steht. "Д ゚" ist eigentlich zwei Zeichen in Unicode. – borrrden

Antwort

7

1) Wie viele in den Kommentaren bereits erwähnt, wird Ihre Kette von 5, die aus Zeichenfolgen (oder Zeichen-Cluster gemacht, wenn Sie bevorzugen). Wenn es durch unichar s wie NSString s length Methode zerlegt wird, erhalten Sie eine 7, die die Zahl unichar s ist, die es benötigt, um Ihre Schnur im Speicher darzustellen.

2) Anscheinend die UITextField und UITextView behandeln die Saiten in einer unichar versierten Weise. Gute Nachrichten, können Sie auch. Siehe # 3.

3) Sie können die Anzahl der zusammengesetzten Zeichenfolgen erhalten, indem Sie einige der NSString API verwenden, die ordnungsgemäß mit zusammengesetzten Zeichenfolgen befasst. Ein kurzes Beispiel ich aufgebacken, sehr schnell ist, eine kleine NSString Kategorie:

@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 

Auch dies ist schnell Code; aber es sollte dich beginnen. Und wenn Sie es so verwenden:

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

Sie werden sehen, dass Sie das gewünschte Ergebnis erhalten.

Für eine ausführliche Erläuterung der NSString API die WWDC 2012 Session 215 Video "Text and Linguistic Analysis"

1

Sowohl und Д゚ Besuche werden durch ein von zwei character sequence Unicode-Zeichen dargestellt (auch wenn sie als eine visuell präsentiert werden). -[NSString length] Berichte die Anzahl der Unicode-Zeichen:

Die zurückgegebene Zahl enthält die einzelnen Zeichen zusammengesetzt Zeichenfolgen, so Sie diese Methode nicht, wenn ein Zeichenfolge sichtbar sein wird, um bestimmen können, wenn sie gedruckt oder wie lange es wird erscheint.

Wenn Sie die Byte-Darstellung sehen wollen:

#import <Foundation/Foundation.h> 

NSString* describeUnicodeCharacters(NSString* str) 
{ 
    NSMutableString* codePoints = [NSMutableString string]; 
    for(NSUInteger i = 0; i < [str length]; ++i){ 
     long ch = (long)[str characterAtIndex:i]; 
     [codePoints appendFormat:@"%0.4lX ", ch]; 
    } 
    return codePoints; 
} 


int main(int argc, char *argv[]) { 
    @autoreleasepool { 
     NSString *s = @" ゚Д゚"; 
     NSLog(@"%ld unicode chars. bytes: %@", 
      [s length], describeUnicodeCharacters(s)); 
    } 
} 

Die Ausgabe lautet: 4 unicode chars. bytes: 0020 FF9F 0414 FF9F.

2) und 3): was NJones gesagt hat.