使用 NSCharcterSet 进行 URL 编码

Posted

技术标签:

【中文标题】使用 NSCharcterSet 进行 URL 编码【英文标题】:URL Encoding with NSCharcterSet 【发布时间】:2018-09-25 11:39:53 【问题描述】:

我的应用程序目录中存储的视频文件和图像文件很少。我正在使用 stringByAddingPercentEscapesUsingEncoding: 转换为合法的 URL 字符串。由于它已被弃用,我们将使用 stringByAddingPercentEncodingWithAllowedCharacters: 代替,我无法获得正确的 URL 来加载 pdf 或播放视频。我尝试了所有可用的 NSCharacterSet。它正在为空间添加额外的 %252020,这会造成问题。

使用 stringByAddingPercentEscapesUsingEncoding

file:///var/mobile/Containers/Data/Application/1392B0FE-F998-45A4-A398-A3ACB47ECE26/Library/Private%20Documents/Sample%20Image%20To%20Be%20Loaded.jpg

使用 ** stringByAddingPercentEncodingWithAllowedCharacters**

file:///var/mobile/Containers/Data/Application/1392B0FE-F998-45A4-A398-A3ACB47ECE26/Library/Private%2520Documents/Sample%2520Image%2520To%2520Be%2520Loaded.jpg

这找不到文件,因此无法加载它。非常感谢任何帮助。

【问题讨论】:

你以什么字符串开头? /var/mobile/Containers/Data/Application/1392B0FE-F998-45A4-A398-A3ACB47ECE26/Library/Private Documents/Sample Image To Be Loaded.jpg 一些网址有方括号,如 /var/mobile/Containers/Data/Application/1392B0FE-F998-45A4-A398-A3ACB47ECE26/Library/Private Documents/Sample Image To Be Loaded_[12345679].jpg 它将 %20 转换为 %2520 并将方括号 %5B 转换为 %255B 获得 %2520 的方式是当您的 url 中已经有 %20,然后再次进行 urlencoded,这会将 %20 转换为 %2520。 另一个例子 - /var/mobile/Containers/Data/Application/E1C0E3F8-673D-4360-A03B-2871CE4A25F0/Library/Private Documents/Summer Joy [06821124RWeXf].jpg 编码为 file:///var/mobile/Containers/Data/Application/E1C0E3F8-673D-4360-A03B-2871CE4A25F0/Library/Private%2520Documents/Summer%2520Joy%2520%255B06821124RWeXf%255D.jpg 我正在使用类似这样的代码 - NSURL *urlToLoad = [NSURL fileURLWithPath: [fullPath stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLPathAllowedCharacterSet]]]; 【参考方案1】:

获得 %2520 的方式是当您的 url 中已经有 %20 时,然后再次进行 url 编码,这会将 %20 转换为 %2520。 %255B 是对方括号进行两次编码后得到的结果。

您可以在空项目中尝试以下代码:

NSString * str = @"/var/mobile/Containers/Data/Application/1392B0FE-F998-45A4-A398-A3ACB47ECE26/Library/Private Documents/Sample Image To Be Loaded.jpg";
NSString * encodedString = [str stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];
NSLog(@"encodedString = %@", encodedString);
NSString * encodedStringAgain = [encodedString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];
NSLog(@"encodedStringAgain = %@", encodedStringAgain);

打印出来:

encodedString = /var/mobile/Containers/Data/Application/1392B0FE-F998-45A4-A398-A3ACB47ECE26/Library/Private%20Documents/Sample%20Image%20To%20Be%20Loaded.jpg

encodedStringAgain = /var/mobile/Containers/Data/Application/1392B0FE-F998-45A4-A398-A3ACB47ECE26/Library/Private%2520Documents/Sample%2520Image%2520To%2520Be%2520Loaded.jpg

在你的代码中你所要做的就是:

NSURL *urlToLoad = [NSURL fileURLWithPath: fullPath];

fullPath 是没有任何编码的原始字符串。

【讨论】:

【参考方案2】:

你可以使用

NSString * encodedString = [@"stringURl to encode" stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];

【讨论】:

没有帮助。我尝试了所有 NSCharacterset 选项。 :(

以上是关于使用 NSCharcterSet 进行 URL 编码的主要内容,如果未能解决你的问题,请参考以下文章

python3url编解码base64编解码ASE加解密

SpringMVC 解析编程式路由

URL编码表 Base64编码表 HTTP消息含义

URL编码表%20Base64编码表%20HTTP消息含义

url-loader配置了limit参数后,url仍旧编译为base64

hTTP的URL编码