Возможно, вы ищете extended grapheme clusters
, что является хорошим определением воспринимаемого пользователем символа. Окно Swift String's character
обеспечивает это удобно.
Какао NSString
обеспечивает enumerateSubstringsInRange:options:usingBlock:
, которые могут быть использованы для подсчета «составленная последовательности символов», которая похожа:
@interface NSString (ComposedCharacterSequenceCount)
@property (nonatomic, readonly, getter=nr_composedCharacterSequenceCount) NSInteger composedCharacterSequenceCount;
@end
@implementation NSString (ComposedCharacterSequenceCount)
- (NSInteger)nr_composedCharacterSequenceCount
{
__block NSInteger count = 0;
[self enumerateSubstringsInRange:(NSRange){0, self.length}
options:NSStringEnumerationByComposedCharacterSequences | NSStringEnumerationSubstringNotRequired
usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) {
count += 1;
}];
return count;
}
@end
Этого фрагмент кода добавляет категорию в NSString, что позволяет вашим легко вычислить количество символов:
NSLog(@"count: %@", @(@"Roger is a nice guy".composedCharacterSequenceCount));
NSLog(@"count: %@", @(@"रॉजर एक छान माणूस आहे".composedCharacterSequenceCount));
NSLog(@"count: %@", @(@"罗杰是一个好人".composedCharacterSequenceCount));
печатает:
count: 19
count: 16
count: 7
Есть ли причина, по которой 'string.length' не работает? Вы на самом деле пытаетесь подсчитать глифы? – Avi
@ Символы Avi - это другое понятие, чем глифы. Рассмотрим, например, лигатуры. 'ffi' - это лигатура, которая объединяет три символа в один символ. –
Мне это хорошо известно. Я пытался получить вопрос о плакате, чтобы уточнить, что она хочет. Я придумал в основном тот же код, что и вы, как ответ, но я не публиковал его, потому что вы избили меня. – Avi