Swift 4.1中.addingPercentEncoding编码结果异常的原因咨询
关于
addingPercentEncoding处理下划线不一致的问题 首先,咱们先搞清楚addingPercentEncoding(withAllowedCharacters:)的核心工作逻辑:
这个方法会逐个遍历字符串里的每个字符,要是字符不在你指定的CharacterSet允许范围内,就会把它转换成UTF-8编码的%XX格式;如果在允许范围内,就直接保留原字符。
按照正常情况,CharacterSet.urlPathAllowed是包含半角下划线(_,Unicode编码U+005F)的,所以下划线根本不应该被编码成%20(这是空格的编码)。你遇到的这种不一致情况,大概率是下面几个原因之一:
1. 你第一个字符串里的"下划线"其实不是真的下划线
很有可能是输入或显示环境出了问题,把空格显示成了下划线,或者你误输入了视觉相似但编码不同的字符:
- 如果你的字符串实际是
"Real Madrid CF"(用空格分隔),那编码后得到Real%20Madrid%20CF就完全合理。 - 要是输入了全角下划线(
_,U+FF3F),它的编码会是%EF%BC%BF,不是%20,所以这个可能性不大。
你可以用这段代码验证字符串的真实内容:
let a = "Real_Madrid_CF" for scalar in a.unicodeScalars { print("\(scalar) - \(scalar.value)") }
半角下划线的value是95,空格的value是32,一眼就能区分出来。
2. 项目里的CharacterSet被意外修改了
如果你的项目中有人写了CharacterSet的扩展,或者全局修改了urlPathAllowed的内容,比如移除了下划线,就会导致下划线被编码。而当字符串包含非ASCII字符时,可能因为某些逻辑(比如动态调整字符集)导致这个修改没生效,从而出现不一致的结果。
你可以搜索项目里有没有类似这样的代码:
extension CharacterSet { static var customPathAllowed: CharacterSet { var set = CharacterSet.urlPathAllowed set.remove("_") // 这段代码会把下划线从允许集合里删掉 return set } }
3. 旧版本Swift/Foundation的bug
极少数情况下,旧版本的框架可能存在字符集判断的bug,导致对下划线的处理异常。这种情况下,升级到最新的Swift版本应该能解决问题。
解决办法
- 先验证字符串的真实字符(用上面的Unicode标量打印代码),确认是不是空格冒充了下划线。
- 如果你需要确保下划线始终被保留,可以手动创建自定义字符集,明确包含下划线:
var allowedChars = CharacterSet.urlPathAllowed allowedChars.insert("_") // 强制把下划线加入允许集合 let a = "Real_Madrid_CF".addingPercentEncoding(withAllowedCharacters: allowedChars)! print(a) // 应该输出 Real_Madrid_CF - 检查项目中有没有修改
CharacterSet的代码,把意外移除下划线的逻辑改回来。
内容的提问来源于stack exchange,提问作者A.C
相关产品推荐
相关产品推荐

