Кодировка строки Swift как экранированного юникода? - PullRequest
1 голос
/ 10 апреля 2019

Поле данных API поддерживает только кодировку ASCII - но мне нужно поддерживать Юникод (эмодзи, иностранные символы и т. Д.)

Я бы хотел закодировать ввод текста пользователем в виде экранированной строки Юникода:

let textContainingUnicode = """
Let's go ? in the ?.
  And some new lines.
"""

let result = textContainingUnicode.unicodeScalars.map { $0.escaped(asASCII: true)}
  .joined(separator: "")
  .replacingOccurrences(
    of: "\\\\u\\{(.+?(?=\\}))\\}", <- converting swift format \\u{****}
    with: "\\\\U$1",               <- into format python expects
    options: .regularExpression)

result здесь "Let\'s go \U0001F3CA in the \U0001F30A.\n And some new lines."

А на сервере декодирование с python:

codecs.decode("Let\\'s go \\U0001F3CA in the \\U0001F30A.\\n And some new lines.\n", 'unicode_escape')

Но это пахнет смешноя действительно должен сделать так много манипуляций строк в быстром, чтобы получить экранированный юникод?Эти форматы не стандартизированы по языкам.

1 Ответ

1 голос
/ 11 апреля 2019

Вы можете использовать уменьшение в своей коллекции и проверить, является ли каждый символ ASCII, если true вернет этот символ, иначе преобразует специальный символ в юникод:

Swift 5 • Xcode 10.2

extension StringProtocol where Self: RangeReplaceableCollection {
    var asciiRepresentation: SubSequence {
        return reduce("") { string, char in
            if char.isASCII { return string + String(char) }
            let hexa = char.unicodeScalars
                .map { String($0.value, radix: 16, uppercase: true) }
                .joined()
            return string + "\\\\U" + repeatElement("0", count: 8-hexa.count) + hexa
        }
    }
}

let textContainingUnicode = """
Let's go ? in the ?.
  And some new lines.
"""

let asciiRepresentation = textContainingUnicode.asciiRepresentation
print(asciiRepresentation)  // "Let's go \\U0001F3CA in the \\U0001F30A.\n  And some new lines."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...