iOS 的URL編碼

stringByAddingPercentEscapesUsingEncoding:

用這個方法進行轉義,每個漢字將轉成相應的unicode編碼對應的3個%形式踊谋,還會轉義一些特殊字符(比如空格會變成%20,#會變成%23,[會變成%5B等)却妨。該方法現在已經被廢棄耗帕,官方建議使用stringByAddingPercentEncodingWithAllowedCharacters:(下面會進行介紹)另玖。

stringByAddingPercentEscapesUsingEncoding:的用法:

NSString *queryWord = @"[q q&";

NSString *escapedString = [queryWord stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSLog(@"%@", escapedString);

打印結果為:%5Bq%20q&

可以發(fā)現空格和[都被轉義了佣赖,但是&沒有恰矩。

- (NSString *)stringByAddingPercentEncodingWithAllowedCharacters:(NSCharacterSet *)allowedCharacters的使用

這個方法是iOS7.0開始有的,這個方法會對字符串進行更徹底的轉義茵汰,需要傳遞一個參數:這個參數是一個字符集(NSCharacterSet?)枢里,這個字符集的作用是在進行轉義過程中孽鸡,不會對這個字符集中包含的字符進行轉義蹂午,使這個字符集中的字符保持原樣。

NSCharacterSet的介紹

NSCharacterSet類似一個字符串處理工具彬碱,除了在URL轉義中用到還可以用它來處理字符串豆胸。

NSCharacterSet的常用API:

/** 根據一個給定的字符串獲取一個NSCharacterSet對象 */

+ (NSCharacterSet*)characterSetWithCharactersInString:(NSString*)aString;

/** 相反字符串限制 ?*/

@property(readonly,copy)NSCharacterSet* invertedSet;

/** 常用快捷方法集合 (常用的,已滿足大多數需求) */

@property (readonly, class, copy) NSCharacterSet *whitespaceCharacterSet //空格

@property (readonly, class, copy) NSCharacterSet *whitespaceAndNewlineCharacterSet //空格和換行符

@property (readonly, class, copy) NSCharacterSet *decimalDigitCharacterSet //0-9的數字

@property (readonly, class, copy) NSCharacterSet *letterCharacterSet //所有字母 + lowercaseLetterCharacterSet//小寫字母

@property (readonly, class, copy) NSCharacterSet *uppercaseLetterCharacterSet //大寫字母

@property (readonly, class, copy) NSCharacterSet *alphanumericCharacterSet //所有數字和字母(大小寫不分)

@property (readonly, class, copy) NSCharacterSet *punctuationCharacterSet //標點符號

@property (readonly, class, copy) NSCharacterSet *newlineCharacterSet //換行

@property (class, readonly, copy) NSCharacterSet *URLQueryAllowedCharacterSet//URL中允許的字符的字符集巷疼。

上述屬性使用了class修飾晚胡,直接用[NSCharacterSet?whitespaceCharacterSet]就能獲取空格字符串集

例子一:使用NSCharacterSet轉義字符

轉義除了空格之外的所有字符

NSString *queryWord = @"[q q&";

NSCharacterSet *set = [NSCharacterSet whitespaceCharacterSet];

NSString *escapedString = [queryWord stringByAddingPercentEncodingWithAllowedCharacters:set];

NSLog(@"%@", escapedString);

打印結果為:%5B%71 %71%26可以發(fā)現除了空格之外的所有參數都被轉義,字母也被轉義了(這只是展示用法,實際參數轉義的時候還是要視情況定)估盘。

例子二:轉義除了空格和字母之外的字符

NSString *queryWord = @"[q q&";

NSMutableCharacterSet *letterSet = [NSMutableCharacterSet letterCharacterSet];

[letterSet addCharactersInString:@" "];

NSString *escapedString = [queryWord stringByAddingPercentEncodingWithAllowedCharacters:letterSet];

NSLog(@"%@", escapedString);

打印結果為:%5Bq q%26

例子三:使用NSCharacterSet處理字符串

需求:把字符串中的數字和字符串分別截取出來瓷患,分成兩個字符串

NSString *originalStr = @"qssq21233fd23j49fr034";

NSCharacterSet *numCharacterSet = [NSCharacterSet decimalDigitCharacterSet];//創(chuàng)建數字的字符串集

NSArray *letterArray = [originalStr componentsSeparatedByCharactersInSet:numCharacterSet];//把不在字符集中的字符分離成數組

NSString *letterStr = [letterArray componentsJoinedByString:@""];//把字符數組以空字符串拼成一個字符串

NSArray *numArray = [originalStr componentsSeparatedByCharactersInSet:[numCharacterSet invertedSet]];

NSString *numStr = [numArray componentsJoinedByString:@""];

NSLog(@"字母字符串:%@", letterStr);

NSLog(@"數字字符串:%@", numStr);

打印結果:字母字符串:qssqfdjfr

? ?????????????????數字字符串:212332349034

AFNetworking中轉義字符串的源碼解析

NSString * AFPercentEscapedStringFromString(NSString *string) {

? ? //定義兩個字符串,這兩個字符串中的字符還是需要轉義的

? ? static NSString * const kAFCharactersGeneralDelimitersToEncode = @":#[]@"; // does not include "?" or "/" due to RFC 3986 - Section 3.4

? ? static NSString * const kAFCharactersSubDelimitersToEncode = @"!$&'()*+,;=";

????//獲取URL中允許的字符的字符集。

? ? NSMutableCharacterSet * allowedCharacterSet = [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy];

????//在URL中允許的字符的字符集中移除上面需要轉義的字符集

? ? [allowedCharacterSet removeCharactersInString:[kAFCharactersGeneralDelimitersToEncode stringByAppendingString:kAFCharactersSubDelimitersToEncode]];

// FIXME: https://github.com/AFNetworking/AFNetworking/pull/3028

? ? // return [string stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacterSet];

????//以50個字符為單位截取字符串

? ? static NSUInteger const batchSize = 50;

? ? NSUInteger index = 0;

? ? NSMutableString *escaped = @"".mutableCopy;

????//最后一次字符的位置比字符串的長度星餐住()即未轉義完時繼續(xù)轉義

? ? while (index < string.length) {

????????//獲取剩余字符串長度和截取單位50的最小值擅编,剩余長度大于50,先截取50個字符

? ? ? ? NSUInteger length = MIN(string.length - index, batchSize);

? ? ? ? NSRange range = NSMakeRange(index, length);

? ? ?????//像表情(????????),一個表情有多個字符箫踩,這個方法是為了防止表情或者漢字被截斷

? ? ? ? range = [string rangeOfComposedCharacterSequencesForRange:range];

? ? ? ? NSString *substring = [string substringWithRange:range];

????????//轉義allowedCharacterSet字符集外的字符

? ? ? ? NSString *encoded = [substring stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacterSet];

????????//把轉義后的字符拼接到準備的可變字符串

? ? ? ? [escaped appendString:encoded];

? ? ? ? index += range.length;

? ? }

return escaped;

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末爱态,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子境钟,更是在濱河造成了極大的恐慌锦担,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件慨削,死亡現場離奇詭異洞渔,居然都是意外死亡,警方通過查閱死者的電腦和手機理盆,發(fā)現死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門痘煤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人猿规,你說我怎么就攤上這事衷快。” “怎么了姨俩?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵蘸拔,是天一觀的道長。 經常有香客問我环葵,道長调窍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任张遭,我火速辦了婚禮邓萨,結果婚禮上,老公的妹妹穿的比我還像新娘菊卷。我一直安慰自己缔恳,他們只是感情好,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布洁闰。 她就那樣靜靜地躺著歉甚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪扑眉。 梳的紋絲不亂的頭發(fā)上纸泄,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天赖钞,我揣著相機與錄音,去河邊找鬼聘裁。 笑死雪营,一個胖子當著我的面吹牛,可吹牛的內容都是我干的衡便。 我是一名探鬼主播卓缰,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼砰诵!你這毒婦竟也來了征唬?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤茁彭,失蹤者是張志新(化名)和其女友劉穎总寒,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體理肺,經...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡摄闸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了妹萨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片年枕。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖乎完,靈堂內的尸體忽然破棺而出熏兄,到底是詐尸還是另有隱情,我是刑警寧澤树姨,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布摩桶,位于F島的核電站,受9級特大地震影響帽揪,放射性物質發(fā)生泄漏硝清。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一转晰、第九天 我趴在偏房一處隱蔽的房頂上張望芦拿。 院中可真熱鬧,春花似錦查邢、人聲如沸蔗崎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚁趁。三九已至裙盾,卻和暖如春实胸,著一層夾襖步出監(jiān)牢的瞬間他嫡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工庐完, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留钢属,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓门躯,卻偏偏與公主長得像淆党,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子讶凉,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內容