Как отделить emojis, введенный (через клавиатуру по умолчанию) в текстовое поле

Я ввел две emojis в текстовое поле 👨👨👧👧😍, здесь я получаю общее количество из 5 символов, тогда как 4 символа для первого emoji и 1 символ для второго. Похоже, что яблоко объединило 4 emojis, чтобы сформировать один.

Я ищу быстрый код, в котором я могу отдельно отделять каждый из emojis, предположим, взяв приведенный выше пример, я должен получать 2 строки / символ отдельно для каждого emoji.

Может ли кто-нибудь помочь мне решить эту проблему, я пробовал много вещей, таких как разделение регулярных выражений или компонентыSeparatedByString или characterSet. но, к сожалению, закончилось отрицательным.

Заранее спасибо.

2 Solutions collect form web for “Как отделить emojis, введенный (через клавиатуру по умолчанию) в текстовое поле”

Обновление для Swift 4 (Xcode 9)

Что касается Swift 4 (протестирован с использованием Xcode 9 beta), то «Последовательность Emoji ZWJ» рассматривается как один Character как это предусмотрено стандартом Unicode 9:

 let str = "👨‍👨‍👧‍👧😍" print(str.count) // 2 print(Array(str)) // ["👨‍👨‍👧‍👧", "😍"] 

Также String представляет собой набор его символов (снова), поэтому мы можем вызвать str.count чтобы получить длину, и Array(str) чтобы получить все символы в виде массива.


(Старый ответ для Swift 3 и ранее)

Это лишь частичный ответ, который может помочь в этом конкретном случае.

«👨👨👧👧» действительно представляет собой комбинацию из четырех отдельных символов:

 let str = "👨‍👨‍👧‍👧😍" // print(Array(str.characters)) // Output: ["👨‍", "👨‍", "👧‍", "👧", "😍"] 

которые склеены вместе с U + 200D (ZERO WIDTH JOINER):

 for c in str.unicodeScalars { print(String(c.value, radix: 16)) } /* Output: 1f468 200d 1f468 200d 1f467 200d 1f467 1f60d */ 

Перечисление строки с параметрами .ByComposedCharacterSequences сочетает эти символы правильно:

 var chars : [String] = [] str.enumerateSubstringsInRange(str.characters.indices, options: .ByComposedCharacterSequences) { (substring, _, _, _) -> () in chars.append(substring!) } print(chars) // Output: ["👨‍👨‍👧‍👧", "😍"] 

Но есть и другие случаи, когда это не работает, например, «флаги», которые представляют собой последовательность «Региональные символы индикатора» (ср. Swift countElements () возвращают неверное значение, когда флаг флагов emoji ). С

 let str = "🇩🇪" 

результат этого цикла

 ["🇩", "🇪"] 

что не является желаемым результатом.

Полные правила определены в «Графических кластерах Графема» в «Стандартном приложении № 29 UNICODE TEXT SEGMENTATION» в стандарте Unicode.

Вы можете использовать этот пример кода или этот модуль .

Чтобы использовать его в Swift, импортируйте категорию в свой YourProject_Bridging_Header

 #import "NSString+EMOEmoji.h" 

Затем вы можете проверить диапазон для каждого emoji в своей строке:

 let example: NSString = "👨‍👨‍👧‍👧😍" // your string let ranges: NSArray = example.emo_emojiRanges() // ranges of the emojis for value in ranges { let range:NSRange = (value as! NSValue).rangeValue print(example.substringWithRange(range)) } // Output: ["👨‍👨‍👧‍👧", "😍"] 

Я создал небольшой пример проекта с приведенным выше кодом.

Для дальнейшего чтения эта интересная статья из Instagram .

  • Проверить версию ОС в Swift?
  • UITableView отстает при отображении изображений Swift
  • UITableView добавляет строки и прокручивается вниз
  • Использование функции или метода типа?
  • UITextView - настройка максимальных строк скрывает курсор
  • Как узнать, будут ли отображаться две эмоции как один эмози?
  • iOS Facebook SDK - Открытие ссылки на профиль пользователей работает в Safari, но не если у пользователя есть приложение Facebook, установленное на их телефоне
  • swift 3 error
  • «Приостановка» игры в Swift
  • Как уловить «Индекс вне диапазона» в Swift?
  • Где / когда вызывать contentOffset на WKWebView?
  • Interesting Posts

    Усилить UIFont для рендеринга как моноширинный

    iOS 10 «Запуск регистрации WebFilter для процесса» + Заголовок прокси-авторизации удален из запроса

    Воспроизведение видеофайла с 1.5x, 2x скоростью

    почему мой столбец не вызывает didselectrowatindexpath до второго касания?

    Сбой приложения iOS только тогда, когда не отладка

    Кнопка Google Plus One для iPhone

    Spritekit: как заставить экран игрового экрана двигаться вверх, поскольку узел «прыгает» вдоль оси y?

    iOS Swift: данные Tableview исчезают, когда я просматриваю их

    Как изменить размер изображения в iOS?

    Bounce UIScrollView – подскажите, что есть еще

    Как показать виджет такой же, как виджет Alarm (Clock APP)?

    CUICatalog: Invalid Request: запрос подтипа без указания идиомы

    iPhone CATextLayer не отображает текст

    «Приложение не смогло уклониться в течение 60-х» в проекте «Реагент-родной»

    Возвращение числа меньше 1

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.