2013-02-18 1 views
6

(# ゚ Д ゚)는 5 글자 단어입니다. 그러나 아이폰 OS에서, [@ "(# ゚ Д ゚)"길이는 7.(# ゚ Д ゚)는 5 글자 단어입니다. 하지만 iOS에서는 [@ "(# ゚ Д ゚)"길이]가 7입니다. 왜?

  1. 왜?

  2. 또는 UITextView의 텍스트를 수정하려면 <UITextInput>을 사용하고 있습니다. 5 문자 길이의 UITextRange를 만들면 (# ゚ Д ゚)를 커버 할 수 있습니다. 자, 왜이 (# ゚ Д ゚)는 UITextFieldUITextView에서 5 문자의 단어처럼 보이지만 NSString에서 7 문자의 단어처럼 보입니다 ???

  3. 이 경우 정확한 길이의 문자열을 얻으려면 어떻게해야합니까? 원하는 경우 이미 언급 한 코멘트에

+0

짐작하면 문자 인코딩 - NSString이 바이트 수와 문자 수를 비교합니까? 아마도 2 자의 문자가 실제로 멀티 바이트 문자이고 NSString이 위로 이동합니다 ... 문자 그대로 – AndrewP

+0

(# ゚ Д ゚)은 텍스트 편집기에서 복사하여 붙여 넣으면 7자를가집니다. – Bahamut

+2

끝 부분에 공백이 있으므로 "6 자"처럼 보입니다. 그러나 "Д ゚"는 실제로 유니 코드의 두 문자입니다. – borrrden

답변

7

1)으로 많은 당신의 문자열) 5 구성 문자 시퀀스 (또는 문자 클러스터로 구성된다. unicharNSStringlength 방법으로 세분화하면 문자열을 메모리에 나타 내기 위해 숫자가 unichar 인 7이됩니다.

2) 분명히 UITextFieldUITextView은 한마디로 정교한 방법으로 문자열을 처리합니다. 좋은 소식, 너도 할 수있어. # 3 참조.

3) 구성된 문자 시퀀스를 제대로 처리하는 NSString API를 사용하면 구성된 문자 시퀀스의 수를 얻을 수 있습니다. I가 구운 빠른 예는 매우 빠르게, 작은 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]); 

원하는 결과가 표시됩니다. NSString API의 충분히 설명은 WWDC 2012 Session 215 Video "Text and Linguistic Analysis"

1

모두 Д゚ 및 체크 아웃 용

가 (들이 시각적으로 표시 한 경우에도)을 character sequence 개의 유니 코드 문자로 표시된다. -[NSString length] 보고서 유니 코드 문자의 수 : 수 반환

가 구성 문자 시퀀스의 개별 문자를 포함, 그래서 인쇄 할 때 당신이 문자열을 볼 수 있는지 확인하기 위해이 방법을 사용할 수 없습니다 또는 얼마나 것으로 표시됩니다.

당신이 바이트 표현 보려면 :

#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)); 
    } 
} 

출력은 다음과 같습니다 4 unicode chars. bytes: 0020 FF9F 0414 FF9F합니다.

2) 및 3) : NJones가 말한 것.