Twitter API, как конвертировать Unicode в строку? - PullRequest
0 голосов
/ 16 января 2020

Twitter Api Ответ:

"retweet_count" = 0;
            retweeted = 0;
            source = "<a href=\"http://twitter.com/download/android\" rel=\"nofollow\">Twitter for Android</a>";
            text = "ALTIN alm\U0131\U015f ba\U015f\U0131n\U0131 gidiyor... bakal\U0131m t\U00fcrk liras\U0131 daha ne kadar de\U011fersizle\U015fecek @Turkiye @BorsaAltin\U2026 https://twitter.com/i/web/status/1216306036602277889";
            truncated = 1;

Мой код:

    let request = client.urlRequest(withMethod: "GET", urlString: statusesShowEndpoint, parameters: params, error: &clientError)


    client.sendTwitterRequest(request) { (response, data, connectionError) -> Void in
        if connectionError != nil {
            print("Error: \(connectionError)")
        }

        do {
            let json = try JSONSerialization.jsonObject(with: data!, options: [])
            print("json: \(json)")
        } catch let jsonError as NSError {
            print("json error: \(jsonError.localizedDescription)")
        }
    }
}

как я могу конвертировать Unicode в строку? я не использую модель.

Ответы [ 2 ]

0 голосов
/ 16 января 2020

Надеюсь, это поможет. Я сделал игровую площадку, чтобы проверить эту проблему. Свифт будет жаловаться на то, что строка содержит неправильные символы перехода. Это проблема, и код не будет компилироваться: enter image description here

Swift ожидает, что Юникод будет отформатирован с помощью ex '\ u0131' или '\ u {0131}, но вы получите API Twitter с '\ U0131'

Сначала нужно «санировать» ввод, иначе он не будет работать! Также, когда я протестировал нижеприведенное, я не смог сохранить ввод в строку с неправильным экранированием. Перед выполнением каких-либо операций над ними компилятор проверяет правильность строк.

Я использовал хитрость. Прежде чем сохранить входные данные из файла, я разбил их на массив символов с картой, из этих символов я проверяю с помощью фильтра, какой из них является экранирующей backla sh, удалите его и снова объедините символы, чтобы сформировать строку. Извините, но я не нашел другого способа, просто наличие '\ U' на моем входе заставило бы Свифта наорать на меня.

enter image description here

То, что остается в входная строка «ALTIN ​​almU0131U015f ..et c»

enter image description here

Теперь мне нужно заменить эти «U0131» на «\ u0131» и для этого я использую Regex:

enter image description here

И это окончательный результат моего теста String как свойства моей структуры после преобразования. Я извиняюсь, если мой код немного запутан, но пройти проверку строки в Swift было нелегко!

enter image description here

Ниже приведен код игровой площадки Подробнее.

Я создал файл json с вашим вводом в качестве теста:

enter image description here

Затем создайте структура, отражающая свойства 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)
}
0 голосов
/ 16 января 2020

Вы можете использовать \ u {Unicode}:

print("Ain\u{2019}t i am a smart boy")
/* Prints "Ain’t i am a smart boy"

Вы также можете использовать это расширение

extension String {
    var unescapingUnicodeCharacters: String {
        let mutableString = NSMutableString(string: self)
        CFStringTransform(mutableString, nil, "Any-Hex/Java" as NSString, true)

        return mutableString as String
    }
}

let input = "ALTIN alm\\u0131\\u015f ba\\u015f\\u0131n\\u0131 gidiyor... bakal\\u0131m t\\u00fcrk liras\\u0131 daha ne kadar de\\u011fersizle\\u015fecek @Turkiye @BorsaAltin\\u2026 https://twitter.com/i/web/status/1216306036602277889"

print("result: \(input.unescapingUnicodeCharacters)")
//ALTIN almış başını gidiyor... bakalım türk lirası daha ne kadar değersizleşecek @Turkiye @BorsaAltin… https://twitter.com/i/web/status/1216306036602277889

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...