leizh00701
leizh00701

Reputation: 1963

Substitute for CFURLCreateStringByAddingPercentEscapes in Swift3 iOS10?

I know the method CFURLCreateStringByAddingPercentEscapes is deprecated in iOS10, it suggests me using stringByAddingPercentEncodingWithAllowedCharacters, but I do not using UTF-8, how can I use stringByAddingPercentEncodingWithAllowedCharacters to do the same thing as following:

extension String {
    var gbkEncoded: String {
        let cfEnc = CFStringEncodings.GB_18030_2000
        return CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, self as CFString!, nil, nil, CFStringEncoding(cfEnc.rawValue)) as String
    }
}

Upvotes: 1

Views: 515

Answers (1)

OOPer
OOPer

Reputation: 47896

I'm afraid Apple would not provide us a replacement for CFURLCreateStringByAddingPercentEscapes as non-UTF-8 is not recommended in the modern web standards.

You may need to do it yourself. An example:

extension CharacterSet {
    static let rfc3986Unreserved = CharacterSet(charactersIn: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~")
}

extension String.Encoding {
    static let gb_18030_2000 = String.Encoding(rawValue: CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(CFStringEncodings.GB_18030_2000.rawValue)))
}

extension String {
    func addingPercentEncoding(withAllowedCharacters characterSet: CharacterSet, using encoding: String.Encoding) -> String {
        let stringData = self.data(using: encoding, allowLossyConversion: true) ?? Data()
        let percentEscaped = stringData.map {byte->String in
            if characterSet.contains(UnicodeScalar(byte)) {
                return String(UnicodeScalar(byte))
            } else if byte == UInt8(ascii: " ") {
                return "+"
            } else {
                return String(format: "%%%02X", byte)
            }
        }.joined()
        return percentEscaped
    }

    var gbkEncoded: String {
        return self.addingPercentEncoding(withAllowedCharacters: .rfc3986Unreserved,  using: .gb_18030_2000)
    }
}

print("互联网".gbkEncoded) //->%BB%A5%C1%AA%CD%F8

Upvotes: 2

Related Questions