swift removedPercentEncoding不适用于gb2312string

服务器返回一个由urlencode函数处理的gb2312string:

D7%CF%BD%FB%B3%C7%C4%A7%D6%%E4_%CE%DE%CF%DE%D0%A1%CB%B5%CD%F8_www.55x.cn.rar

如何解码回gb2312string:

紫禁城魔咒_无限小说网_www.55x.cn.rar

在其他编码方面,使用UTF-8编码的百分比编码在最近的www世界中并不被认为是推荐的方法,所以您可能需要自己实现这种转换。

这可能是这样的:

extension String.Encoding { static let gb_18030_2000 = String.Encoding(rawValue: CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(CFStringEncodings.GB_18030_2000.rawValue))) } extension String { func bytesByRemovingPercentEncoding(using encoding: String.Encoding) -> Data { struct My { static let regex = try! NSRegularExpression(pattern: "(%[0-9A-F]{2})|(.)", options: .caseInsensitive) } var bytes = Data() let nsSelf = self as NSString for match in My.regex.matches(in: self, range: NSRange(0..<self.utf16.count)) { if match.rangeAt(1).location != NSNotFound { let hexString = nsSelf.substring(with: NSMakeRange(match.rangeAt(1).location+1, 2)) bytes.append(UInt8(hexString, radix: 16)!) } else { let singleChar = nsSelf.substring(with: match.rangeAt(2)) bytes.append(singleChar.data(using: encoding) ?? "?".data(using: .ascii)!) } } return bytes } func removingPercentEncoding(using encoding: String.Encoding) -> String? { return String(data: bytesByRemovingPercentEncoding(using: encoding), encoding: encoding) } } let origStr = "%D7%CF%BD%FB%B3%C7%C4%A7%D6%E4_%CE%DE%CF%DE%D0%A1%CB%B5%CD%F8_www.55x.cn.rar" print(origStr.removingPercentEncoding(using: .gb_18030_2000)) //->Optional("紫禁城魔咒_无限小说网_www.55x.cn.rar")