NSRange回転RangeおよびUnicode文字列変換
3988 ワード
バックグラウンドのインタフェースはJS互換性が必要なので、戻ってきたJSONに対してUrlDecode UrlDecodeをしましたか、簡単ですね~呼び出すだけ
もし楽屋の妹紙に殴られたらメンツが立たない--百里潋長
まあ、途方に暮れても、同時に2つの符号化フォーマットがある文字列を直接変換する方法は見つからないので、自分で手を出すしかありません.
発想は簡単:UTF 8のUnicode部分を抽出し、単独で復号再統合する元の列のUnicode形式の文字を正規検索する
これを見て
すべてのUnicodeサブストリングを選択Unicode文字列をUTF 8符号化に変換元の列に置き換えるここのUnicodeは文字列がUnicode符号化形式ではなく、UTF 8形式の文字列の内容がUnicode符号化であることを意味していますが、迂回していると思いませんか?どうせ従来のデータ復号ではできないんだから、言わないで、二ちゃん、コードをつけなさい. Unicodeを取り除いた純UTF 8形式のDecodeを復号する大回りして、やっとオヤジのUnicode部分を取り除いて、最後に快く呼び出す
これはまた何の鬼ですか?!(╯‵□′)╯︵┻━┻
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部分を抽出し、単独で復号再統合する
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
ここが正則として使われていることを知るべきNSRegularExpression
OCのもので、入手したのはNSRange
、Swift 3で検索して使う必要があるRange
先を進む必要があるNSRange
回るRange
、さらに変換するUnicode列を見つけて1つ追加NSRange
回るRange
のextension
使いやすい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
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
}
removingPercentEncoding
復号するlet value = originallyString.removingPercentEncoding
print("\(value)")
// "{\"IsOK\": false,\"Message\": \" \",\"RowCount\":0}"
これはまた何の鬼ですか?!(╯‵□′)╯︵┻━┻