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语言查找字符串au,几个C语言词汇不懂,望老鸟们相助(俺是新手哦)

几个C语言词汇 auto break case char const continue default do double else enum extern float for goto if int long registerreturn short signed几个C语言词汇 auto break case char const continue default do double else enum extern float for goto if int long regis…

c语言中 %.2s,C2S是什么意思

1. The testing result indicates that TiO_2 has mineralized effect on C_2S, at the same time flux effect on reducing low general melting point of CaO-SiO_2 system and yielding much liquid phase, TiO_2 has definite stabilized effect on β-C_2S.结果随着TiO2掺…

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

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

用英文单词模拟数字计算c语言,C语言程序设计用英文单词模拟数学计算

匿名用户1级2010-05-09 回答最后输出是用的是阿拉伯数字,这个你再改改吧, 小问题了。。。。#include #include #include #include #include int carry 0;int parse_int(const char *s, int len){char tens[10], units[10];memset(tens, 0, sizeof(tens)…

c语言猜数字游戏新建,C语言编程 如何构建一个简单的猜数字小游戏

#include//生成随机函数起点时用到time.hint main(){int number1 0, choice 0, number2 0;printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");//界面设置printf("$$$$$ 欢 迎 来 到 $$$$$\n");printf("$$$$$ 猜 数 字 …

c语言循环拆分成和,C语言拆分循环链表程序

创建一个循环链表,并将这个循环链表拆分成为两个循环链表的示例程序,将以下代码保存到一个源文件中:split_circular_linked_list.c, 如下所示 –#include #include struct node { int data; struct node *next; }; struct node *e…

pic单片机c语言读eeprom,PIC16F877单片机内部EEPROM读写实例

;PIC16F877单片机内部EEPROM读写实例****************************************************************************************; This is a program to test the function of reading&writting for EEPROM.; YouCANOBServe the value of register(30H--?) buy changin…

C语言运行gis空间叠加分析,GIS空间叠加分析与缓冲区分析.doc

《地理信息系统》报告专 业 资源环境与城乡规划管理 姓 名 成 绩班 级 学 号 日 期 2014/6/20目录TOC \o "1-2" \h \u 14469 一、题目 23290 二、设计目的27200 三、设计背景2四、设计内容27200 四、步骤与过程27200 五、专题地图 37521 四、总结分析 9题目佛山市顺德…

组件文件已损坏或android内部模块,android - Android Q更新后,模块化系统组件在托管配置文件中不可用 - 堆栈内存溢出...

在从工作配置文件配置的设备设置应用中将操作系统从Android 9升级到10后,请停止运行。java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.settings/com.android.settings.applications.InstalledAppDetailsTop}: java.lang.NullPoin…

android文本复制自定义剪切板,android 剪切板-文本复制、粘贴

1. 粘贴-文本保存到剪切板中ClipboardManager clipboardManager (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);//创建ClipData对象ClipData clipData ClipData.newPlainText("orderNo", txt);//添加ClipData对象到剪切板中…

android保持服务不休眠,Android开发保持屏幕常亮和CPU不休眠唤醒状态

安卓手机 APP 开发,有的时候需要屏幕长时间亮着,也就是不锁屏,这时CPU会一直处于不休眠唤醒状态。下面介绍两种方法。方法一:通过 PowerManager 实现。此种方法会在软件安装时用户可以看到屏幕选项。首先,在 AndroidMa…

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

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

android spinner位置,在Android中的Spinner中没有选择位置0

我创建了一个有三个项目的微调器日常每周每月一次我在我的java文件中执行了以下操作:navSpinner new ArrayList();navSpinner.add(new SpinnerNavItem(getResources().getString(R.string.dailyview)));navSpinner.add(new SpinnerNavItem(getResources().getStrin…

android tombstone发生过程,Android Tombstone解决步骤

这周和同事一起解了个tombstone的bug, 记录下分析的过程&#xff0c;免得以后又忘记。。。1>log的分析pid: 122, tid: 14745, name: Binder_2 >>> /system/bin/mediaserver <<<signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000058eax 00000…

优酷android手机客户端for,优酷手机客户端

优酷手机客户端官方最新版是官方出品的最新版播放软件&#xff0c;该软件上面汇聚了其他视频app上没有的精彩节目&#xff0c;全国各大精彩剧集与电影免费首播&#xff0c;更有独特高清蓝光画质播放&#xff0c;想要体验的朋友可以来欣赏一下!软件特点1、高清流畅播放2、国内外…

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

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

html表格中绑定显示xml文档内容的简单实例,JS读取XML文件数据并以table形式显示数据的方法(兼容IE与火狐)...

本文实例讲述了JS读取XML文件数据并以table形式显示数据的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;先看xml文件&#xff1a;张秋丽女 18李文才男 31李斯文男 22马英女 25孙红雷男 32欧阳俊雄男 28江琳女 23小小女 22aspx页面代码&#xff1a;function load…

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

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

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

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