c语言 字符串 url,如何对URL字符串进行百分号编码

9c486bc52a7d4947a3fa1fd157049d42.png

在和web服务进行交互时,我们经常需要对URL中的特定字符和传输的表单数据进行百分号编码。例如,’&’在百分号编码时会变成’%26’。搞清楚 URL中哪部分的哪些字符应该进行百分号编码了并不是件易事。最好的资料好像是RFC 3986和W3C HTML5。出于兴趣和教育目的,我创建了swift的String的扩展(和作为对比的Objective-C的分类)。

RFC3986 编码查询字符串

在 RFC3986 的第2.3节列出了你不需要百分号编码的字符,因为它们在URL中没有特殊的含义。

ALPHA / DIGIT / “-” / “.” / “_” / “~”

α/数字/”-”/”.”/”_”

第3.4节也解释了因为查询往往会本身包含一个URL,最好不要百分号编码斜杠(“/”)和问号(“?”)。这也是受欢迎的iOS HTTP网络库Alamofire采取的方法,这给了我信心。

因此,用RFC 3986编码一个兼容性的查询,我们可以百分号编码如上所述以外的所有字符。这很简单,如果我们首先构建一组允许的字符,然后用stringByAddingPercentEncodingWithAllowedCharacters去编码剩余的。

注意:苹果已经在iOS 9中弃用了stringByAddingPercentEscapesUsingEncoding或CFURLCreateStringByAddingPercentEscapes这两个方法。

Swift

首先,swift String extension:extension String {

func stringByAddingPercentEncodingForRFC3986() -> String? {

let unreserved = "-._~/?"

let allowed = NSMutableCharacterSet.alphanumericCharacterSet()

allowed.addCharactersInString(unreserved)

return stringByAddingPercentEncodingWithAllowedCharacters(allowed)

}

}

Object-C

我们可以用Object-C的NSString的分类来做相同的事。@implementation NSString (URLEncoding)

- (nullable NSString *)stringByAddingPercentEncodingForRFC3986 {

NSString *unreserved = @"-._~/?";

NSMutableCharacterSet *allowed = [NSMutableCharacterSet alphanumericCharacterSet];

[allowed addCharactersInString:unreserved];

return [self stringByAddingPercentEncodingWithAllowedCharacters: allowed];

}

@end

用例// Swift

let query = "one&two =three"

let encoded = query.stringByAddingPercentEncodingForRFC3986()

// "one%26two%20%3Dthree"

// Objective-C

NSString *query = @"one&two =three";

NSString *encoded = [query stringByAddingPercentEncodingForRFC3986];

// "one%26two%20%3Dthree"

对x-www-form-urlencoded进行编码

推荐W3C HTML5 对表单数据编码是相似的,但是和RFC 3986有一点不同。在第4.10.22.5节中告诉我们下列字符是不应该百分号编码:

ALPHA / DIGIT / “*” / “-” / “.” / “_”

α/数字/”-”/”.”/”_”

你应该用“+”(0x2B)代替空格(“ ”)。它和RFC 3986 的不同在 Stack Overflow answer 里有描述。波浪号(“~”)被百分号编码了,但是星号(“*”)没有。该建议很好地总结了这种情况:这种编码的表单数据在很多方面是异常的,多年来的实践的问题和折中解决导致了互通性的一系列必要操作。但是绝不代表好的设计实践。

Swift

给String extension添加一个新的方法public func stringByAddingPercentEncodingForFormData(plusForSpace: Bool=false) -> String? {

let unreserved = "*-._"

let allowed = NSMutableCharacterSet.alphanumericCharacterSet()

allowed.addCharactersInString(unreserved)

if plusForSpace {

allowed.addCharactersInString(" ")

}

var encoded = stringByAddingPercentEncodingWithAllowedCharacters(allowed)

if plusForSpace {

encoded = encoded?.stringByReplacingOccurrencesOfString(" ",

withString: "+")

}

return encoded

}

注意,由于很多 web服务好像不关心我用“+”或者百分号编码将空格做了可选的编码。

Object-C

Object-C的方法缺少一个可选参数- (nullable NSString *)stringByAddingPercentEncodingForFormData:(BOOL)plusForSpace

{

NSString *unreserved = @"*-._";

NSMutableCharacterSet *allowed = [NSMutableCharacterSet                                     alphanumericCharacterSet];

[allowed addCharactersInString:unreserved];

if (plusForSpace) {

[allowed addCharactersInString:@" "];

}

NSString *encoded = [self stringByAddingPercentEncodingWithAllowedCharacters:allowed];

if (plusForSpace) {

encoded = [encoded stringByReplacingOccurrencesOfString:@" " withString:@"+"];

}

return encoded;

}

用例:// Swift

let query = "one two"

let space = query.stringByAddingPercentEncodingForFormData()

// "one%20two"

let plus = query.stringByAddingPercentEncodingForFormData(true)

// "one+two"

// Objective-C

NSString *query = @"one two";

NSString *encodedQuery = [query stringByAddingPercentEncodingForFormData:YES];

// "one+two"

源代码

Swift代码和一些测试用例你可以在我的Github代码实例库的Encode项目里找到,Object-C的分类和测试用例在TwitterSearch项目里。欢迎反馈和改进。

深入阅读

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382947.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

击鼓传花击鼓次数相同c语言,JavaScript 实现击鼓传花游戏

大家小时候应该都玩过击鼓传花(Hot Potato)的游戏吧!一群小孩围成一个圆圈,把花尽快的传给旁边的人。某一时刻传花停止,这时花在谁手里,谁就退出圆圈结束游戏。重复此过程,直到剩下最后一个孩子,即为胜者。…

前端的c语言面试题,前端工程师面试题汇总(选择题)

前端工程师面试题汇总(选择题)时间:2017-12-05 来源:前端工程师面试题推荐作为一名前端工程师,我们必不可少的就是参加面试,面试过程中会遇到各类奇葩的问题,今天小编为大家汇总了一些相关的问题,希望可…

android 磁场传感器 罗盘,Android开发获取重力加速度和磁场强度的方法

本文实例讲述了Android开发获取重力加速度和磁场强度的方法。分享给大家供大家参考,具体如下:Android获取重力加速度和磁场强度主要依靠:Sensor.getRotationMatrix (float[] R, float[] I, float[] gravity, float[] geomagnetic)输入数据&am…

html在线编辑器 asp.net,ASP.NET网站使用Kindeditor富文本编辑器配置步骤

1. 下载编辑器下载 KindEditor 最新版本,下载页面: http://www.kindsoft.net/down.php2. 部署编辑器解压 kindeditor-x.x.x.zip 文件,将editor文件夹复制到web目录下3、在网页中加入(ValidateRequest"false")4、引入脚本文件(XXX部分需要修改)…

html中通过定位 实现下拉,JS+CSS相对定位实现的下拉菜单

本文实例讲述了JSCSS相对定位实现的下拉菜单。分享给大家供大家参考。具体如下:这里使用的是相对定位,不过效果还可以,用时候再修整一下,这个只是实现了大概功能,还有许多细节没有修饰。运行效果截图如下:在…

html页面包含头文件,Web前端技术:HTML部分---Head标签中包含的头文件标签,body标签包含的内部标签...

1、Head标签中包含的 头文件标签的作用:(1)title标签:定义网页的标题。(2)meta标签:一般用于定义页面的特殊信息,例如页面的关键字、页面描述等(3)link标签:用于引入外部样式文件(CSS 文件)。(4)style标签:…

HTML如何做个播放器图表,Web绘图神器之ECharts-ts文件播放器

前言最近在做一个项目需要用到大量的图形报表来展示数据。就去对比了一些前端图形报表框架,有Highcharts、Echarts、Three.js。发现Three.js比较笨重,不太适合数据展示,做前端动画还是比较好。而highcharts、echarts比较轻量级拿来就用比较方…

计算机网络原码反码补码,计算机的原码和反码及补码到底是什么

数据在计算机里面都是以0和1存储和运算的,这是冯诺依曼体系的基础。比如一个数在计算机中若有正负之分,则用一个数的最高位(符号位)用来表示它的正负,其中0表示正数,1表示负数。原码就是整数绝对值的二进制形式,为了解…

关于计算机应用基础问题,《计算机应用基础》习题及问题详解

《计算机应用基础》习题及问题详解 (17页)本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!19.90 积分实用文档第一章 计算机基础知识填空题:1. 信息技术在现代工业工程中的应用十分广泛&…

计算机网络安全本科大学排名,2021网络工程专业大学排名 最好大学排行榜

2021网络工程专业大学排名 最好大学排行榜2021-06-11 19:35:09文/丁雪竹网络工程专业在全国最好的大学是哪几所呢,最好的大学排名是什么样呢,小编整理网络工程专业大学最好大学排行榜,仅供参考!网络工程专业最好大学排行榜在网络工…

20线程测试cpu性能软件,评测平台介绍、CPU多线程性能测试

2、平台介绍及CPU性能测试AMD AM3平台CPUAMD FX-8150(4模块/8核)AMD FX-8350(4模块/8核)主板华硕 Crosshair V Formula(BIOS版本:1605)Intel LGA1155平台CPUIntel Core i5 3570K(4核/4线程)Intel Core i7 3770K(4核/8线程)主板华硕 P8Z77-V Deluxe共用配件硬盘主盘&…

大型网站服务器 pdf,大型网站服务器容量规划[PDF][145.25MB]

内容简介内 容 提 要本书讲解了用数学回归分析方法来做服务器容量规划的思路,让读者掌握服务器容量规划的量化方法;模型的选择是服务器容量规划的关键,不同的程序有不同的模型。本书使用nginxPHPMySQL为实例演示了具体的规划过程,…

穿越火线全部服务器都显示爆满,穿越火线大区全部爆满,频道挤不进去背后的故事!...

大家好我是小包子,穿越火线经历了十一周年,盛典游戏更新后,我们发现游戏基本上所有大区都呈现爆满的盛世。我们热爱的穿越火线又回来了吗?6月小包子曾爆料CF启动量超过吃鸡跃居第二,射击游戏第一,重回巅峰的…

服务器加根网线用不用修改路由器,安装设置无线路由器需要用几根网线?

“安装设置无线路由器需要用几根网线?看到网上安装设置路由器的教程,有的说需要两根网线,有的说需要一根网线,请问到底应该使用一根还是两根呢?”其实这个问题的答案并不是唯一的,使用一根还是两根&#xf…

大数运算#

大数,就是C/C中利用基本类型所不能存储的数字,少则数十位,大则几万位,如何存储和计算大数就是本文的内容。 在C和C中,没有存储大数的数据结构,就算 unsigned long long也只能表示19位的数字  如果我们用d…

linux之缓冲区

行缓冲。在这种情况下,当在输入和输出中遇到换行符时,标准I/O库执行I/O操作。这允许我们一次输出一个字符,但只有在写了一行之后才进行实际I/O操作。当流涉及一个终端时,通常使用行缓冲。 第一个例子:(he…

linux之地址空间

程序:一组指令的有效集合。它是静态的,不具有任何的运行意义。程序最终转换为二进制文件。 进程:程序的执行就是进程。可以把它看成独立的程序,在内存中有其对应的代码空间和数据空间。一个进程所拥有的数据和代码只属于自己。进…

C语言随机数生成超详解

1.首先来看一段简单的代码 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <time.h>int main(void) {int i;printf(" %6d\n", rand());system("pause"); }printf(" %6d\n", rand());sys…

模板

模板是泛型编程的基础&#xff0c;即与类型无关的逻辑代码。 利用模板机制可以显著减少冗余信息&#xff0c;能大幅度地节约程序代码&#xff0c;进一步提高面向对象程序的可重用性和可维护性。 模板是实现代码重用机制的一种工具&#xff0c;它可以实现类型参数化&#xff1b;…

linux-----强大的find

我又回来了。哈哈。今天我们来说一下linux中的另一个强大的find命令&#xff0c;灰常重要&#xff0c;灰常重要&#xff0c;灰常重要。显而易见&#xff0c;find就是对某一个文件或者目录的查找喽。但是它的一个显著的特点就是&#xff1a;一般放在后台执行&#xff0c;从整个文…