【问题标题】:Twitter Api how to convert unicode to string?Twitter Api如何将unicode转换为字符串?
【发布时间】:2020-05-03 07:09:51
【问题描述】:

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 转换为字符串?我一直不使用模型。

【问题讨论】:

    标签: ios swift xcode twitter


    【解决方案1】:

    我希望这会有所帮助。 我做了一个操场来测试这个问题。 Swift 会抱怨 String 包含不正确的转义字符。 这是一个问题,代码将无法编译:

    Swift 希望 Unicode 使用 ex '\u0131' 或 '\u{0131} 进行格式化,但您收到的 twitter API 使用 '\U0131'

    您需要先“清理”输入,否则将无法正常工作!此外,当我测试以下内容时,我无法将输入保存在转义错误的字符串中。编译器在对字符串进行任何操作之前检查字符串是否正确。

    我使用了一个技巧。在保存文件中的输入之前,我使用 map 拆分为一个字符数组,在这些字符中,我使用过滤器检查哪个是转义的反冲删除它并再次加入字符以形成一个字符串。 抱歉,我没有找到任何其他方法,只是在我的输入中输入 '\U' 会让 Swift 对我大喊大叫。

    输入字符串中剩下的是“ALTIN almU0131U015f ..etc”

    现在我需要用“\u0131”替换那些“U0131”,为此我使用正则表达式:

    这是我的字符串测试的最终输出,作为转换后我的结构的属性。 如果我的代码有点乱,我深表歉意,但要通过 Swift 中的字符串验证并不容易!

    下面是playground的详细代码。

    我所做的是用您的输入创建一个 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)
    }
    

    【讨论】:

      【解决方案2】:

      你可以使用\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
      

      【讨论】:

      • 你需要把U转成u
      猜你喜欢
      • 1970-01-01
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多