NSRange回転RangeおよびUnicode文字列変換

3988 ワード

バックグラウンドのインタフェースはJS互換性が必要なので、戻ってきたJSONに対してUrlDecode UrlDecodeをしましたか、簡単ですね~呼び出すだけremovingPercentEncodingでいいので、喜んでコードを叩き始めました.しかし、事情はそんなに簡単ではありません.呼び出しremovingPercentEncodingずっと戻ってきたnil、バックグラウンドから戻ってきた串がこんなものだったことに気づきました.%7B%22IsOK%22%3A%20false%2C%22Message%22%3A%20%22%u8BF7%u4F20%u5165%u767B%u5F55%u7C7B%u578B%22%2C%22RowCount%22%3A0%7Dはっきり見えます.中には一部変わっています...%u8BF7%u4F20%u5165%u767B%u5F55%u7C7B%u578B...これはUnicodeのコードフォーマットですが、他の部分はUTF 8です.これは何ですか.どうして約束と違うの?コードを楽しく叩くことができますか?!(¯▽¯▽¯)¯(¯▽¯)¯(¯▽¯)¯)¯(¯▽¯)¯(¯▽¯)¯)¯(¯▽¯)¯)¯(¯▽¯)¯)¯でも理性が教えてくれた
もし楽屋の妹紙に殴られたらメンツが立たない--百里潋長
まあ、途方に暮れても、同時に2つの符号化フォーマットがある文字列を直接変換する方法は見つからないので、自分で手を出すしかありません.
発想は簡単:UTF 8のUnicode部分を抽出し、単独で復号再統合する
  • 元の列のUnicode形式の文字を正規検索する
  • var originallyString = "%7B%22IsOK%22%3A%20false%2C%22Message%22%3A%20%22%u8BF7%u4F20%u5165%u767B%u5F55%u7C7B%u578B%22%2C%22RowCount%22%3A0%7D"
    let pattern = "%[uU].{4}"// u U         
    let regu = try? NSRegularExpression(pattern: pattern, options: NSRegularExpression.Options.caseInsensitive)
    let matches = regu?.matches(in: originallyString, options: [], range: NSMakeRange(0, (originallyString as NSString).length))
    

    これを見てNSxxxxここが正則として使われていることを知るべきNSRegularExpressionOCのもので、入手したのはNSRange、Swift 3で検索して使う必要があるRange先を進む必要があるNSRange回るRange、さらに変換するUnicode列を見つけて1つ追加NSRange回るRangeextension使いやすい
    extension String {
        func range(from nsRange: NSRange) -> Range? {
            guard
                let from16 = utf16.index(utf16.startIndex, offsetBy: nsRange.location, limitedBy: utf16.endIndex),
                let to16 = utf16.index(from16, offsetBy: nsRange.length, limitedBy: utf16.endIndex),
                let from = String.Index(from16, within: self),
                let to = String.Index(to16, within: self)
            else { return nil }
            return from..

    すべてのUnicodeサブストリングを選択
    var subs:[String] = []
     for matche:NSTextCheckingResult in matches! {
           let range:Range = originallyString.range(from: matche.range)!
           subs.append(originallyString.substring(with: range))
    }
    print("Subs : \(subs)")//            Unicode   
    
  • Unicode文字列をUTF 8符号化に変換元の列に置き換えるここのUnicodeは文字列がUnicode符号化形式ではなく、UTF 8形式の文字列の内容がUnicode符号化であることを意味していますが、迂回していると思いませんか?どうせ従来のデータ復号ではできないんだから、言わないで、二ちゃん、コードをつけなさい.
  • for sub in subs {
            var sub1 = sub.replacingOccurrences(of: "u", with: "U").replacingOccurrences(of: "%", with: "\\")
            sub1.insert("\"", at: sub1.startIndex)
            sub1.insert("\"", at: sub1.endIndex)
            let data = sub1.data(using: String.Encoding.utf8)
            let encodeStr = try? PropertyListSerialization.propertyList(from: data!, options: PropertyListSerialization.ReadOptions.mutableContainers, format: nil) as! String
            let uf8DicodeStr = encodeStr?.addingPercentEncoding(withAllowedCharacters: CharacterSet.alphanumerics)
                
            originallyString = originallyString.replacingOccurrences(of: sub, with: uf8DicodeStr!)
            print("\(originallyString)")
            //     UTF8         
            //%7B%22IsOK%22%3A%20false%2C%22Message%22%3A%20%22%E8%AF%B7%E4%BC%A0%E5%85%A5%E7%99%BB%E5%BD%95%E7%B1%BB%E5%9E%8B%22%2C%22RowCount%22%3A0%7D
    }
    
  • Unicodeを取り除いた純UTF 8形式のDecodeを復号する大回りして、やっとオヤジのUnicode部分を取り除いて、最後に快く呼び出すremovingPercentEncoding復号する
  • let value = originallyString.removingPercentEncoding
    print("\(value)")
    //    "{\"IsOK\": false,\"Message\": \"       \",\"RowCount\":0}"
    

    これはまた何の鬼ですか?!(╯‵□′)╯︵┻━┻