Reputation: 1963
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
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