You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含韩文URL使用PercentEncoding出现异常结果的问题求助

问题解决:URL中#被错误编码导致404的处理方案

问题根源

直接对完整URL调用addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)时,#会被错误编码为%23——因为.urlQueryAllowed字符集默认不把#列入允许保留的范围。而不含韩文的URL因为所有字符都符合允许规则,方法直接返回原字符串,所以#不会被编码,也就不会触发404。

解决方案

不要对完整URL直接编码,而是拆分URL结构,仅对片段(fragment)里的参数值单独编码,保留#作为片段分隔符的原始作用。具体实现步骤:

  1. 解析原始URL,拆分出scheme、host、path、fragment等核心部分
  2. 对fragment中的每个参数值单独做百分编码
  3. 将编码后的参数重新拼接,再组合回完整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 03:15:50