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.pswp.cn/news/382947.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/382947.shtml
英文地址,請注明出處:http://en.pswp.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;…