NSString转String后拼接路径结果异常,求一致结果解决方案
解决NSString转String后拼接路径结果不一致的问题
这个问题我之前也碰到过,核心原因是Swift String的appendingPathComponent和NSString的stringByAppendingPathComponent处理路径的逻辑完全不同:
为什么会出现差异?
- NSString的
stringByAppendingPathComponent是直接操作文件路径字符串,只会处理路径分隔符(比如自动补全/或\适配不同平台),不会对文件系统允许的特殊字符(比如^、%、&这些)进行编码。 - 而Swift String的
appendingPathComponent底层是通过URL对象处理路径的,会自动对URL中的特殊字符进行百分号编码(比如^变成%5E,%变成%25),这就导致拼接结果和NSString方式出现差异。
解决方案:复用NSString的路径拼接逻辑
要让拼接结果和原来NSString的方式完全一致,最简单的办法就是直接调用NSString的路径拼接方法,不管你用的是Swift String还是NSString类型的变量:
示例代码
假设你的pathComponent是Swift String类型,downloadedFile是NSString转来的String:
// 你的原始变量 let pathComponent = "ttt_gmail_com" let downloadedFile: NSString = "MOM'&^*%s-HC.pdf" let downloadedFileStr = downloadedFile as String // 正确的拼接方式:把Swift String转成NSString调用方法 let correctPath = (pathComponent as NSString).appendingPathComponent(downloadedFileStr) print(correctPath) // 输出:ttt_gmail_com/MOM'&^*%s-HC.pdf
如果你本来就是用NSString类型的pathComponent,直接调用原来的方法就行:
let pathComponent: NSString = "ttt_gmail_com" let correctPath = pathComponent.appendingPathComponent(downloadedFile)
替代方案:用FileManager拼接路径
如果你更倾向于用Swift的API,也可以通过FileManager来拼接,它的路径处理逻辑和NSString一致:
let fileManager = FileManager.default // 假设pathComponent是某个目录的路径 let baseURL = URL(fileURLWithPath: pathComponent, isDirectory: true) let correctURL = baseURL.appendingPathComponent(downloadedFileStr, isDirectory: false) let correctPath = correctURL.path print(correctPath) // 输出同样是:ttt_gmail_com/MOM'&^*%s-HC.pdf
验证结果
用上面的方法拼接后,你会发现输出结果和直接用NSString拼接的完全一致,不会出现特殊字符被编码的问题。
内容的提问来源于stack exchange,提问作者Tushar
相关产品推荐
相关产品推荐

