Twitter Api如何将unicode转换为字符串?

Posted

技术标签:

【中文标题】Twitter Api如何将unicode转换为字符串?【英文标题】:Twitter Api how to convert unicode to string? 【发布时间】: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 转换为字符串?我一直不使用模型。

【问题讨论】:

【参考方案1】:

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

Swift 希望 Unicode 使用 ex '\u0131' 或 '\u0131 进行格式化,但您收到的 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】:

你可以使用\uUnicode:

print("Ain\u2019t 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

以上是关于Twitter Api如何将unicode转换为字符串?的主要内容,如果未能解决你的问题,请参考以下文章

编码/解码有啥区别?

将Twitter API Datetime转换为MySQL Datetime格式

PHP 将Twitter API日期时间转换为MySQL日期时间格式

将 unicode 转换为可读字符串

Twitter Search Api 1.1 错误:无法将“__NSCFDictionary”类型的值转换为“NSArray”

C++ 将 wstring 转换为 Unicode