2013-03-10 1 views
4

대문자 -c의 문자열에서 [myStr length];과 같이 말하면 바이트 수인 숫자를 반환하지만 문자 수를 반환하는 데 사용할 수있는 문자는 무엇입니까? 문자열. 예를 들어문자열의 문자 수 (바이트 수가 아님)

:
은 1
거기에 하나의 이모티콘의 문자열의 길이를 반환합니다 "A"의 문자로 된 문자열을 2 (또는 길이 때로는 4)

의 길이를 반환


이것은 문자열의 바이트 수이기 때문에 ... 문자 수만 있으면됩니다.

+0

@valentinas 내 질문을 다시 wread하시기 바랍니다. 네가 그걸 쥐고있는 것 같지 않아. 그래도 링크에 감사드립니다! 하지만 그건 제가 찾고있는 것이 아닙니다. –

+1

«는 바이트 수입니다.»아니오, 문서에 나와 있듯이 유니 코드 문자의 수입니다. –

+0

@JoshCaswell 설명서가 잘못되었습니다. –

답변

8

방금이 방법을 사용했습니다. NSString 카테고리에 추가하십시오.

- (NSUInteger)characterCount { 
    NSUInteger cnt = 0; 
    NSUInteger index = 0; 
    while (index < self.length) { 
     NSRange range = [self rangeOfComposedCharacterSequenceAtIndex:index]; 
     cnt++; 
     index += range.length; 
    } 

    return cnt; 
} 

NSString *a = @"Hello"; 
NSLog(@"%@ length = %u, chars = %u", a, a.length, a.characterCount); 
NSString *b = @" Emoji "; 
NSLog(@"%@ length = %u, chars = %u", b, b.length, b.characterCount); 

이 수율 :

안녕하세요 길이 = 5, 문자의 = 5
이모티콘 길이 = 11 문자의 = 9

+0

놀라운! rmaddy, 당신은 항상 나를 감동! 하하! 'rangeOfComposedCharacterSequenceAtIndex' 아주 좋습니다! –

+3

(흥미로운 메모, emojis 플래그로 시도해보십시오. 작동하지 않습니다.하지만 emojis 플래그는 실제로 유니 코드 문자가 아니기 때문에 iOS와 OSX가 나란히 배치 될 때 1 문자로 렌더링되는 두 개의 유니 코드 문자입니다. ... ... 예를 들어, 미국 국기는 별표가없는 "*"입니다. "*"를 텍스트 영역 (예 : SO와 같은 주석)에 붙여 넣은 다음 별표를 백 스페이스로 사용하여 어떤 일이 발생하는지보십시오. o) –

+0

매우 흥미로운. 이러한 플래그는 실제로 Mac의 특수 문자 뷰어에 따라 4 개의 유니 코드 심볼입니다. 내 대답은 하나의 플래그가 2의 문자 수를 갖는 반면, 'NSString length'는 4라고보고합니다. 해결 방법을 찾을 수 있는지 보겠습니다. – rmaddy