美文网首页
iOS NSURL 编码, 不同字段解析结果不同引发的 bug

iOS NSURL 编码, 不同字段解析结果不同引发的 bug

作者: wyanassert | 来源:发表于2022-01-12 21:09 被阅读0次

文章地址
在 RFC 3986 文档中规定,URL 中只允许包含以下四种:

  1. 英文字母 a-z 以及 A-Z
  2. 数字 0-9
  3. 4个特殊字符:中横线 -、下划线 _、小数点 . 以及波浪线 ~
  4. 保留字符:!*'();:@&=+$,/?#[]

除上述四种字符外,所有其他字符都将被替换成百分号 % + 两位十六进制数。

@":/?#[]@!$ &'()*+,;=\"<>%{}|\\^~`\r\n\t" // @"" 是 OC 语法, 关注引号中字符即可

这33个字符需要转义, 其中

@" \"#%&()+,/:;<>=?@\\|"

是特殊字符转义编码, 一定要转义

@"{}^[]`~" 

这些属于不安全字段, 传输过程中某些网关会篡改这些字符, 最好也转义
对于 NSURLComponents 不能解析的字符串有

@"[] \"<>%{}|\\^`\r\n\t"

这 16 个字符, 执行 urlComponents.queryItems 为 nil

特殊字符的编码如下:

ASCII 字符 URL-编码
空格 %20
! %21
" %22
# %23
$ %24
% %25
& %26
' %27
( %28
) %29
* %2A
+ %2B
, %2C
- %2D
. %2E
/ %2F
: %3A
; %3B
< %3C
= %3D
> %3E
? %3F
@ %40
[ %5B
\ %5C
] %5D
^ %5E
_ %5F
` %60
{ %7B
| %7C
} %7D
~ %7E

问题原由

在 url 解析参数时, 对 query 参数做了 [NSString stringByRemovingPercentEncoding] 转义, 替换掉了所有的 %20 转义字符, 然后将转移后的 url 交给 WebView 展示. 然后 webview 在使用 NSURLComponents *urlComponents = [[NSURLComponents alloc] initWithString:url]; 解析 url 时, 发现 url 含有'^|'等字符就直接解析失败, 造成 bug, 解决办法也很简单, 在解析失败的时候, 针对

[] \"<>%{}|\\^`\r\n\t

这些字符做重新编码, 然后再使用 NSURLComponents 解析即可, 代码如下

NSString *specialString = @"[] \"<>%{}|\\^`\r\n\t";
NSCharacterSet *allowedCharacters = [[NSCharacterSet characterSetWithCharactersInString:specialString] invertedSet];
NSString *encoded = [url stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacters];
// 再解析 encoded 即可

参考文档

关于URL编码

相关文章

  • iOS NSURL 编码, 不同字段解析结果不同引发的 bug

    文章地址[https://blog.wyan.vip/2022/01/url-percent-encode.htm...

  • Gson解析数据容错率

    增加Gson解析容错率。比如我只需要判断code字段,根据不同状态返回不同json数据,而有些gson 是无法解析...

  • 全面深度解析iOS端URL编码和解码过程

    全面深度解析iOS端URL编码和解码过程全面深度解析iOS端URL编码和解码过程

  • 字符集和字符编码

    乱码 乱码是怎么出现的呢?对同一组二进制数据,不同的编码会解析出不同的字符,用对了编码,解析出来的字符组成的文字是...

  • linux搭建分离解析的域名服务器

    分离解析主要是根据不同的客户端提供不同的域名解析记录,来自不同地址的客户端请求解析同一域名时,提供不同的解析结果。...

  • python 2, 默认unicode编码问题

    同样的python代码,在不同的环境下,一个编码没问题,一个编码显示错误: 【BUG】UnicodeEncodeE...

  • iOS URL编码

    参考 全面深度解析iOS端URL编码和解码过程 iOS中URL编码那些事

  • Fault,Error,Failure&PIE模型

    bug在软件运行的不同时期有不同的含义 Fault 编码过程中【静态】存在于软件中的缺陷。 Error 软件运行过...

  • 不同条件的不同结果

    喜欢你的人,你的一举一动都能牵动他的心;你的文字对于他来说是珍宝,他可以一遍一遍阅读你的文字,揣度你的心情;你无意...

  • 角度不同,结果不同

    角度,就是我们看待问题的出发点。在处理问题时,多角度,多向思维不但能使人看问题更客观全面,而且能激发人们对问题的创...

网友评论

      本文标题:iOS NSURL 编码, 不同字段解析结果不同引发的 bug

      本文链接:https://www.haomeiwen.com/subject/qjkgcrtx.html