含韩文URL使用PercentEncoding出现异常结果的问题求助
问题解决:URL中#被错误编码导致404的处理方案
问题根源
直接对完整URL调用addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)时,#会被错误编码为%23——因为.urlQueryAllowed字符集默认不把#列入允许保留的范围。而不含韩文的URL因为所有字符都符合允许规则,方法直接返回原字符串,所以#不会被编码,也就不会触发404。
解决方案
不要对完整URL直接编码,而是拆分URL结构,仅对片段(fragment)里的参数值单独编码,保留#作为片段分隔符的原始作用。具体实现步骤:
- 解析原始URL,拆分出scheme、host、path、fragment等核心部分
- 对fragment中的每个参数值单独做百分编码
- 将编码后的参数重新拼接,再组合回完整URL
Swift代码示例
let originalURLString = "https://example.url/to/path#name=한글&example=example" // 解析URL各组成部分 guard let url = URL(string: originalURLString), let scheme = url.scheme, let host = url.host, let path = url.path, let fragment = url.fragment else { print("URL解析失败") return } // 处理fragment内的参数编码 let fragmentParts = fragment.components(separatedBy: "&") var encodedFragmentParts: [String] = [] for part in fragmentParts { let keyValuePair = part.components(separatedBy: "=") guard keyValuePair.count == 2 else { encodedFragmentParts.append(part) continue } let key = keyValuePair[0] // 仅对参数值编码 if let encodedValue = keyValuePair[1].addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) { encodedFragmentParts.append("\(key)=\(encodedValue)") } else { encodedFragmentParts.append(part) } } let encodedFragment = encodedFragmentParts.joined(separator: "&") // 重新拼接成正确的URL let finalURLString = "\(scheme)://\(host)\(path)#\(encodedFragment)" print(finalURLString) // 输出结果:https://example.url/to/path#name=%ED%95%9C%EA%B8%80&example=example
补充说明
如果你的URL中还包含?开头的查询参数,同样需要用类似逻辑单独处理查询参数的参数值,避免编码分隔符导致的URL结构错误。
内容的提问来源于stack exchange,提问作者lidium
相关产品推荐
相关产品推荐

