安卓链接正常显示,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
原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理 如下: guard let allowUrl webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时&a…...
excel分列
Excel中有这么几列,希望将每一列内容再分出3列: 可以通过以下步骤在 Excel 表格中将 B 到 F 列的内容拆分为每列的 3 列,分别为 pred_label、pred_score 和 pred_class: 确定数据结构:假设 B 列到 F 列中的内容都是按类…...
STM32 HAL DMA 中断碰到的问题
流程 串口收数据—>dma搬运到变量—>空闲中断----->接收完成 配置 dma中断全部去掉 串口中断开启 freertos中断全部去掉 时钟配置 代码 开启中断 // DMA 空闲检查 void receives_uaru_7(void) {RXU7 0;//清除中断标志HAL_UARTEx_ReceiveToIdle_DMA(&hua…...
让树莓派智能语音助手实现定时提醒功能
最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束…...
AIoTedge边缘计算+边缘物联网平台
在数字化转型的浪潮中,AIoTedge边缘计算平台以其边云协同的架构和强大的分布式AIoT处理能力,正成为推动智能技术发展的关键力量。AIoTedge通过在数据源附近处理信息,实现低延迟、快速响应,增强了应用的实时性。同时,它…...
Java使用拷贝asset文件,解密,并用DexclassLoader加载执行
//asset中加密的apk文件重命名为index.html,拷贝到私有目录 //解密 //加载,执行apk中的方法 public static void handleByJava(Context context){File copyedFile new File(context.getFilesDir().getAbsolutePath() "/" "main.html");FileUtil.copyAss…...
【AcWing】861. 二分图的最大匹配(匈牙利算法)
匈牙利算法,他可以在比较快的时间复杂度之内告诉我们左边和右边成功匹配的最大数是多少 匹配指的是边的数量,成功的匹配指的是两个未被使用的点之间存在一条边(就不存在两条边共用了一个点的)。 匈牙利算法可以返回成功匹配的最大匹配数是多少。 #incl…...
经验笔记:JSP(JavaServer Pages)
JSP(JavaServer Pages)经验笔记 JSP(JavaServer Pages)是一种用于创建动态网页的技术,它允许在HTML页面中嵌入Java代码,从而实现动态内容的生成。JSP与Servlet一样,都是Java EE平台的一部分&am…...
【零基础必看的数据库教程】——SQL WHERE 子句
WHERE 子句用于提取那些满足指定条件的记录,过滤记录。 SQL WHERE 语法: SELECT column1, column2, ... FROM table_name WHERE condition; 参数说明: column1, column2, ...:要选择的字段名称,可以为多个字段。如…...
vscode docker debug python
1. 安装Vscode插件 ”Docker“”Dev Containers““Remote - ssh” 2. 进入Docker环境 点击左侧 Docker图标,选择Containers 对容器进行右键启动 生成新页面直接进行选择文件路径即可,之后得操作均在容器内进行...
【Kubernetes】常见面试题汇总(四)
目录 11.简述 Kubernetes 集群相关组件? 12.简述 Kubernetes Rc 的机制? 11.简述 Kubernetes 集群相关组件? Kubernetes Master控制组件,调度管理整个系统(集群),包含如下组件: (1ÿ…...
MATLAB基础语法知识
环境的配置等等就不写了,网上还是有很多资源可以找,而且正版的要付费,我也是看的网上的搞定的。 一,初识MATLAB 1.1 MATLAB的优势 不需要过多了解各种数值计算方法的具体细节和计算公式,也不需要繁琐的底层编程。可…...
PopupInner源码分析 -- ant-design-vue系列
PopupInner源码分析 – ant-design-vue系列 1 综述 上一篇讲解了vc-align的工作原理,也就是对齐是如何完成的。这一篇主要讲述包裹 Align的组件:PopupInner组件是如何工作的。 PopupInner主要是对动画状态的管理,比如打开弹窗的时候&#…...
Maven 的 pom.xml 文件中<dependency> 元素及其各个参数的解释
在 Maven 的 pom.xml 文件中,<dependency> 标签用于定义项目依赖的外部库。每个 <dependency> 元素包含了一系列的子元素,这些子元素定义了依赖库的各种属性。下面是一个典型的 <dependency> 元素及其各个参数的解释: <…...
【信创】Linux终端禁用USB存储 _ 统信 _ 麒麟 _ 方德
原文链接:【信创】Linux终端禁用USB存储 | 统信 | 麒麟 | 方德 Hello,大家好啊!今天给大家带来一篇关于在Linux终端下禁用USB存储设备的文章。禁用USB存储设备可以提高系统的安全性,防止未经授权的人员将数据拷贝到外部存储设备或…...
开放API接口时要注意的安全处理总结
开发API接口:开放给别人调用的接口。未经过安全处理的开发API接口安全弱点:数据窃取(密码等信息被窃取,盗刷,敏感信息的等)——RSA/DES加密: 签名机制在API接口中的应用:签名用于验证…...
FastGPT自定义插件的icon
最近研究FastGPT的自定义插件,经过好几天的折磨,终于实现了一个简单的发送邮件功能,但是呢在使用的时候发现插件的icon是默认的fastgpt的logo,那肯定得自定义一个啊。直接说方法: 1、自定义插件下面的template.json文件…...
SprinBoot+Vue旅游网站的设计与实现
目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质…...
代码随想录刷题day27丨455.分发饼干 ,376. 摆动序列 ,53. 最大子序和
代码随想录刷题day27丨455.分发饼干 ,376. 摆动序列 ,53. 最大子序和 1.贪心算法理论基础 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 这么说有点抽象,来举一个例子: 例如,有一堆钞票,你可以拿走十张&a…...
Detect It Easy
Detect It Easy(简称 DIE)项目的网址为 https://github.com/horsicq/Detect-It-Easy 下载完安装包后,直接双击die.exe即可进入到操作界面 工具介绍: 它可以用来检测程序架构和文件类型。如图所示。其中,「模式」说明程…...
Unity2022工业级数字孪生基座:OPC UA+Win11原生适配变电站系统
1. 这不是“换个贴图”的Demo,而是一套可交付的工业级数字孪生基座 你有没有遇到过这样的情况:客户在会议室白板上画了个变电站草图,说“我们要一个数字孪生系统”,然后技术团队翻出Unity Asset Store里买来的几个变压器模型&…...
Ubuntu 22.04 LTS下,UE5打包的程序报‘Vulkan设备找不到’?别急着重装驱动,先试试这个库文件修复法
Ubuntu 22.04 LTS下解决UE5 Vulkan设备报错的深度修复指南当你在Ubuntu 22.04 LTS上已经确认NVIDIA驱动安装成功(通过nvidia-smi验证),但Unreal Engine 5打包的程序仍然抛出"Vulkan设备找不到"的错误时,问题往往比表面看…...
基于Hugging Face BART模型构建文本摘要服务:从原理到部署实战
1. 项目概述:从零构建一个可用的文本摘要服务文本摘要,这个听起来有点学术的词,其实离我们很近。想想看,每天面对海量的新闻、报告、论文,甚至冗长的会议纪要,谁不想快速抓住核心要点?这就是文本…...
Linux 用户与用户组核心概念详解(零基础必懂)
前言Linux 是典型的多用户、多任务操作系统,支持多人同时登录、各司其职、权限隔离。所有文件、进程、权限都依托用户与用户组实现管控,是Linux权限体系的基石。彻底弄懂用户、用户组概念,是掌握服务器权限管控、账号运维的前提,本…...
小样本下机器学习模型性能稳定性评估:分位数与置信区间实战
1. 项目概述与核心价值在机器学习项目的落地过程中,我们常常会面临一个灵魂拷问:这个模型到底有多“稳”?你辛辛苦苦调参、优化,在某个特定测试集上跑出了95%的准确率,但换个数据划分方式,或者重新初始化一…...
MLQM:用机器学习加速量子比特映射,破解量子编译“最后一公里”难题
1. 项目概述与核心挑战量子计算这行,这几年硬件跑得飞快,但软件栈这块,尤其是怎么把咱们写的量子程序高效、保真地“烧录”到真实的量子芯片上,一直是个头疼的“最后一公里”问题。这其中的关键一步,就是量子比特映射。…...
Windows下复现CVPR2019低光照增强EnlightenGAN:从环境配置到预测避坑全记录
Windows平台复现EnlightenGAN低光照增强实战指南引言低光照图像增强一直是计算机视觉领域的重要研究方向。2019年CVPR会议上提出的EnlightenGAN以其无需配对监督的创新训练方式,成为该领域的标志性工作之一。对于大多数使用Windows系统的研究者和开发者来说…...
从零读懂RDMA流控机制:为什么RC需要“信用”
我们在之前的文章里讲过,RDMA RC(可靠连接)模式像一条点对点的专用通道:发送端发数据,接收端确认,丢了包硬件重传。一切看起来很简单,但有一个关键问题没解决: 发送端怎么知道接收端“吃得下”自己发过去的数据? 如果发送端不管不顾地疯狂发,而接收端处理不过来,数据…...
AI Agent如何重构数据分析工作流:从数据清洗到洞察生成的7步自动化闭环(附企业级架构图)
更多请点击: https://intelliparadigm.com 第一章:AI Agent如何重构数据分析工作流:从数据清洗到洞察生成的7步自动化闭环(附企业级架构图) 传统数据分析依赖人工串联多个工具与脚本,耗时长、容错低、知识…...
Harness的配置漂移检测与自动修复
云原生时代的稳定性利器:Harness配置漂移检测与自动修复全指南 引言 痛点引入 相信每一位DevOps工程师、SRE或者运维负责人都遇到过这样的噩梦: 测试环境验证了3天的功能,上线到生产10分钟就出现503错误,排查了2小时才发现&…...
