在Swift3 iOS10中replaceCFURLCreateStringByAddingPercentEscapes?

我知道在CFURLCreateStringByAddingPercentEscapes中不build议使用stringByAddingPercentEncodingWithAllowedCharacters方法,它build议我使用stringByAddingPercentEncodingWithAllowedCharacters ,但是我没有使用UTF-8,我怎样才能使用stringByAddingPercentEncodingWithAllowedCharacters来做同样的事情,如下所示:

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

恐怕苹果不会为我们提供CFURLCreateStringByAddingPercentEscapes的替代品,因为在现代Web标准中不build议使用非UTF-8。

你可能需要自己做。 一个例子:

 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