本文主要是介绍安卓链接正常显示,ios#符被转义%23导致链接访问404,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
原因分析:
url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理
如下:
guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return}
后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问。
这表名.urlQueryAllowed并没有包含字符"#"。
也有提供API可以测试:
.urlQueryAllowed.contains("#")
解决方案:
显而易见,只要将字符"#"加到.urlQueryAllowed即可解决这个问题。
CharacterSet提供了三个方法:
取并集
/// Returns a union of the `CharacterSet` with another `CharacterSet`.
public func union(_ other: CharacterSet) -> CharacterSet取交集
/// Returns an intersection of the `CharacterSet` with another `CharacterSet`.
public func intersection(_ other: CharacterSet) -> CharacterSet取补集
/// Returns a `CharacterSet` created by removing elements in `other` from `self`.
public func subtracting(_ other: CharacterSet) -> CharacterSet
为CharacterSet增加一个新属性
extension CharacterSet {static let allowedCharacters = urlQueryAllowed.union(.init(charactersIn: "#"))
}
上面的url编码方法改为
guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .allowedCharacters) else {return}
在编码过程中不对字符#操作即可解决。
寻根究底
.urlQueryAllowed中到底包含哪些字符?
以下是遍历NSCharacterSet字符集一种的实现方式。(摘自:URL详解以及iOS中URLencode和URLdecode)
NSString* characters(NSCharacterSet *set){NSMutableString *string = [NSMutableString string];for (UInt8 plane = 0; plane < 17; plane++) {if ([set hasMemberInPlane:plane]){UInt32 p0 = (UInt32)plane * 65535;UInt32 p1 = (UInt32)(plane + 1) * 65535;for (UInt32 i = p0; i < p1; i ++) {if([set longCharacterIsMember:i]){[string appendFormat:@"%c",I];}}}}return string;}
原理:OC中的字符是Unicode字符集(Swift也是)Unicode共有17个扇区,每个扇区能表示65535个Unicode字符,用4个字节就可以表示任意Unicode码点,通过遍历Unicode字符集就可以找出NSCharacterSet包含的集合了;
hasMemberInPlane:判断当前字符是否在当前扇区。
longCharacterIsMember:当前字符在字符集中是否存在。
NSCharacterSet提供了标准字符集:部分字符集遍历结果如下:
URLUserAllowedCharacterSet
!$&'()*+,-.0123456789;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~
URLHostAllowedCharacterSet
!$&'()*+,-.0123456789:;=ABCDEFGHIJKLMNOPQRSTUVWXYZ[]_abcdefghijklmnopqrstuvwxyz~
URLPathAllowedCharacterSet
!$&'()*+,-./0123456789:=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~
URLQueryAllowedCharacterSet
!$&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~
URLPasswordAllowedCharacterSet
!$&'()*+,-.0123456789;=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~
URLFragmentAllowedCharacterSet
!$&'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~
这篇关于安卓链接正常显示,ios#符被转义%23导致链接访问404的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!