iOS Copy Вставить телефон из контактов в UITextField добавляет странные символы Unicode

Упрощенный сценарий следующий.

  • Новый проект с использованием шаблона приложения Single View.
  • Добавьте UITextField в ViewController.
  • Запустите приложение и скопируйте и вставьте контактный номер телефона [ej. John Appleseed one (888) 555-5512) ] в UITextField.

Номер будет добавлен с символом Unicode в начале и в конце, получив как \u{e2}(888) 555-5512\u{e2} при изучении переменной во время отладки.

Это действительно странно и, на мой взгляд, не предполагаемое поведение. Это ошибка или что-то, что работает намеренно таким образом?

Код:

Здесь ничего сложного. Как описано выше, новый проект, добавьте UITextField, кнопку добавления, и если кнопка запускает печать результата. В принтере будет отображаться телефон просто отлично, просто поместите контрольную точку в линию print и посмотрите значение телефона var, чтобы увидеть, что я имею в виду.

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var phoneLabel: UITextField!

    @IBAction func goButton(_ sender: UIButton) {

        let text = phoneLabel.text ?? ""
        print(text)
    }
}

Протестировано:

  • iOS 11.1 - iPhone X
  • Xcode 9.1

Шаги с изображениями:

enter image description here


enter image description here


Это то, что я получил на линии точки останова.

enter image description here

Ответы

Ответ 1

Недавно у меня была такая же проблема. Довольно интересно то, что вы видите в отладчике, к сожалению, не то, что действительно вставлено. Если вы скопируете номер в другое место и исследуете его с помощью консоли, например, вы получите следующий результат:

>>> u"\U+202D(888) 5555-5512\U+202C"
u'\u202d(888) 5555-5512\u202c'
>>> name(u"\U+202D")
'LEFT-TO-RIGHT OVERRIDE'
>>> name(u"\U+202C")
'POP DIRECTIONAL FORMATTING'

Таким образом, вы можете видеть, что на самом деле два разных невидимых персонажа контролируют поток текста.

Чтобы решить это, я отфильтровал все символы cF категории cF Таким образом, вы можете сделать:

phoneLabel.text?.replacingOccurrences(of: "\\p{Cf}", with: "", options: .regularExpression)