Можно ли автоматически преобразовать 3-байтовые символы Unicode в ascii

Можно ли автоматически преобразовать обе альтернативы «дефиса», показанные ниже, в «дефис» ascii с использованием строк Swift и кодирования, не прибегая к конкретным экземплярам вызовов replacingOccurrencesOfWith?

.replacingOccurrences(of: "—", with: "-")   // Replace "e2 80 94" (wide hyphen) with a normal hyphen
.replacingOccurrences(of: "‐", with: "-")   // Replace "e2 80 90" (narrow hyphen) with a normal hyphen

В настоящее время я использую функцию replacingOccurrencesOfWith для преобразования определенных символов, которые вызывают сбой моей программы, когда я пытаюсь вставить охватывающие строки в свою базу данных MySQL. Поскольку таких проблемных символов много (каждый из них выглядит как 3-байтовый юникод), мне в конечном итоге понадобится гигантский список replacingOccurrencesOfWith вызовов, чтобы обработать их все. Поэтому ищу что-то более эффективное.

Что касается «автоматического», мне интересно, есть ли функция Swift String, которая будет понижать символ юникода до приблизительно правильного символа ascii? Например; «ń» -> «n», «ó» -> «o», и «ü» -> «u», и «-» -> «-», «-» -> «-».

Причина, по которой мне нужно преобразовать эти символы, заключается в том, что MySqlSwiftNative возвращает ошибки MySQL, когда я пытаюсь вставить их в свою базу данных, хотя я уже установил DEFAULT CHARACTER SET utf8mb4 и COLLATE utf8mb4_unicode_ci для своей базы данных/таблиц и могу напрямую вставлять символы в базу данных с помощью phpMyAdmin.

MySqlSwiftNative (из GitHub/mcorega) — работающий собственный Swift MySQL API, который, к сожалению, не имеет деятельности примерно через два года.


person gone    schedule 02.09.2019    source источник
comment
Что значит автоматически? Без запуска кода? А что касается вашего кода, вы пробовали его? Какая именно проблема у вас с ним?   -  person Amadan    schedule 02.09.2019
comment
replacingOccurrences будет работать для длинных и коротких дефисов, так зачем вам их преобразовывать?   -  person Joakim Danielson    schedule 02.09.2019
comment
Пожалуйста, ознакомьтесь с обновлением OP, в котором разъясняется, что я пытаюсь сделать; избежать сотен replacingOccurrencesOfWith.   -  person gone    schedule 02.09.2019
comment
Вы try con.exec("SET NAMES utf8")?   -  person Amadan    schedule 03.09.2019


Ответы (1)


Вы можете выполнить «преобразование строки» в ASCII:

let text = "ń—ó‐ü"
let trans = text.applyingTransform(StringTransform(rawValue: "Latin-ASCII"), reverse: false)!
print(trans) // n-o-u


print(Array(text.unicodeScalars))
// ["\u{0144}", "\u{2014}", "\u{00F3}", "\u{2010}", "\u{00FC}"]

print(Array(trans.unicodeScalars))
// ["n", "-", "o", "-", "u"]

Для получения дополнительной информации см.

person Martin R    schedule 03.09.2019