Надеюсь, это поможет. Я сделал игровую площадку, чтобы проверить эту проблему. Свифт будет жаловаться на то, что строка содержит неправильные символы перехода. Это проблема, и код не будет компилироваться:
Swift ожидает, что Юникод будет отформатирован с помощью ex '\ u0131' или '\ u {0131}, но вы получите API Twitter с '\ U0131'
Сначала нужно «санировать» ввод, иначе он не будет работать! Также, когда я протестировал нижеприведенное, я не смог сохранить ввод в строку с неправильным экранированием. Перед выполнением каких-либо операций над ними компилятор проверяет правильность строк.
Я использовал хитрость. Прежде чем сохранить входные данные из файла, я разбил их на массив символов с картой, из этих символов я проверяю с помощью фильтра, какой из них является экранирующей backla sh, удалите его и снова объедините символы, чтобы сформировать строку. Извините, но я не нашел другого способа, просто наличие '\ U' на моем входе заставило бы Свифта наорать на меня.
То, что остается в входная строка «ALTIN almU0131U015f ..et c»
Теперь мне нужно заменить эти «U0131» на «\ u0131» и для этого я использую Regex:
И это окончательный результат моего теста String как свойства моей структуры после преобразования. Я извиняюсь, если мой код немного запутан, но пройти проверку строки в Swift было нелегко!
Ниже приведен код игровой площадки Подробнее.
Я создал файл json с вашим вводом в качестве теста:
Затем создайте структура, отражающая свойства JSON, в данном случае только одно: "test"
public struct Test: Codable {
var test = ""
}
// this is the initialisation of the empty struct to be filled from json
var unicodetest: Test = Test()
func parse(json: Data) {
let decoder = JSONDecoder()
if let testmodel = try? decoder.decode(Test.self, from: json) {
unicodetest = testmodel
print(unicodetest.test)
}
}
// Here I get my Json and parse with the above function
do {
guard let fileUrl = Bundle.main.url(forResource: "test", withExtension: "json") else { fatalError() }
let input = try String(contentsOf: fileUrl, encoding: String.Encoding.utf8).map {String($0)}.filter {$0 != "\\"}.joined(separator: "")
if let sanitisedData = input.replacingOccurrences(of: "U(.*?)", with: "\\\\u$1", options: .regularExpression).data(using: .utf8){
parse(json: sanitisedData)
}
} catch {
// if something did not work out
print(error)
}