Я обычно не такой осуждающий, но текущие ответы будут работать ... пока они не будут!
В ObjC / Foundation существует только один способ перечисления фактических символов Юникода:
- (void)enumerateSubstringsInRange:(NSRange)range options:(NSStringEnumerationOptions)opts usingBlock:(void (^)(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop))block
с использованием параметра
NSStringEnumerationByComposedCharacterSequences
Проблема, которая лучше всего иллюстрируется с помощьюEmoji:
? (имя Unicode: PILE OF PO, кодовая точка: U + 1F4A9) равно 0xD83DDCA9, если оно представлено как UTF-16 Cocoa / Foundation / CoreFoundation для внутреннего использования.Вы получите две (поврежденные, недействительные) записи с другими методами.
Если ваши строки длинные и производительность становится проблемой, а память - нет, вы можете использовать UTF-32 и снова получить доступ кперсонажи в постоянном времени.Просто сохраните их в массиве C или в векторе C ++.Или просто оберните 32-битные значения в NSNumber и используйте NSArray, если производительность не так уж критична ...
Я настоятельно рекомендую прочитать NSString и Unicode из objc.io, выпуск № 9.
Редактировать 2016-05-15: Термин «персонаж» в этом контексте не имеет четкого определения и может вводить в заблуждение.То, что я называю выше как «символ», на самом деле является кодовой точкой Unicode.Swift делает все правильно и определяет символ как «то, что пользователь считает символом».