1. 程式人生 > >iOS開發之--URL 編碼

iOS開發之--URL 編碼

在 iOS 程式訪問 HTTP 資源時需要對 URL 進行 Encode,比如像拼出來的 http://unmi.cc?p1=%+&sd f&p2=中文,其中的中文、特殊符號&%和空格都必須進行轉譯才能正確訪問。

在 Java、.net 和 JS 中都有相應的 encodeURL 方法可用,在 Objective-C 語言中,你可以試下

- (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)enc;

來對完整的 URL(帶請求引數的)進行編碼,比如執行下面的程式碼:

 NSString *
[email protected]
"http://unmi.cc?p1=%+&sd &p2=中文";  NSString *encodedValue = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

上面程式碼轉換出的 encodedValue 是:

http://unmi.cc?p1=%25+&sd%20&p2=%E4%B8%AD%E6%96%87

可見,它不會轉換 URL 中的 ?%& 符號,這也正常,因為它肯定分不出哪個 & 是引數的連線符號還是引數值,你可以單獨編碼引數,然後在拼接成 URL 之前把屬性引數值中的 ?%& 等符號分別替換成相應的編碼。

或者,您還可以試下另外一個方法來單獨編碼引數值,然後拼接成完整的 URL:

/* newString = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, origString, NULL, NULL, kCFStringEncodingUTF8); */
CF_EXPORT
CFStringRef CFURLCreateStringByAddingPercentEscapes(CFAllocatorRef allocator, CFStringRef originalString, CFStringRef charactersToLeaveUnescaped, CFStringRef legalURLCharactersToBeEscaped, CFStringEncoding encoding);

參考程式碼,分別編碼前面的 p1=%+&sd f&p2=中文,兩個引數的程式碼和結果如下:

NSString *param = @"%+&sd f";
    NSString *encodedValue = (NSString*)CFURLCreateStringByAddingPercentEscapes(nil, 
                                   (CFStringRef)param, nil, 
                                (CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8);

這樣編碼出來的 encodedValue 為 %25%2B%26sd%20f,對 ?%& 等符號也會編碼的。用上面的程式碼對 “中文” 進行編碼的結果是:%E4%B8%AD%E6%96%87,與前面是一致的。

我實際應用時還是這個 CFURLCreateStringByAddingPercentEscapes 方法比較方便。

我們在專案中是使用的 ASIHTTPRequest 元件來訪問 URL 的,在使用 ASIFormDataRequest 時發出它其中有一個方法:

- (NSString*)encodeURL:(NSString *)string
{
    NSString *newString = NSMakeCollectable([(NSString *)CFURLCreateStringByAddingPercentEscapes(
                                                              kCFAllocatorDefault,
                                  (CFStringRef)string, NULL, CFSTR(":/?#[]@!$ &'()*+,;=\"<>%{}|\\^~`"),
                        CFStringConvertNSStringEncodingToEncoding([self stringEncoding])) autorelease]);
    if (newString) {
        return newString;
    }
    return @"";
}

看起來它就是個 Objective-C 版的 encodeURL 方法,可是它宣告成了一個例項方法,必須構造出 ASIFormDataRequest 例項才能使用它,在它的父類 ASIHTTPRequest 中都無該方法。現在來試驗一下這個方法的返回值:

ASIFormDataRequest *formDataRequest = [ASIFormDataRequest requestWithURL:nil];
NSString *encodedValue1 = [formDataRequest encodeURL:@"%+&sd f"];
NSString *encodedValue2 = [formDataRequest encodeURL:@"中文"];

得出的 encodedValue1 和 encodedValue2 分別是 %25%2B%26sd%20f 和 %E4%B8%AD%E6%96%87,和前面是一致的,所以你可以用 ASIFormDataRequest 提供的方式來進行 URLEncode,把這個方法提出為一個工具方法即可。


相關推薦

iOS開發--URL 編碼

在 iOS 程式訪問 HTTP 資源時需要對 URL 進行 Encode,比如像拼出來的 http://unmi.cc?p1=%+&sd f&p2=中文,其中的中文、特殊符號&%和空格都必須進行轉譯才能正確訪問。 在 Java、.net 和 JS

iOS開發遇到的那些坑 NSURLRequest開發URL編碼

前言:專案中遇到一個根據傳遞的引數下載指定的PDF文件的介面,但是折騰啊!!!無論我用AFN下載還是直接用NSURLRequest都老是下載不了,後來和伺服器工程師聯調找到原因是編碼問題,如下,封裝一個編碼類在拼接引數的時候對其編碼,折騰半天終於下載成功ing!!!記錄下來

iOS開發視頻根據url獲取第一幀圖片,獲取任一幀圖片

keyword rac onerror 根據 ati parameter all ger mage + (UIImage*) thumbnailImageForVideo:(NSURL *)videoURL atTime:(NSTimeInterval)time { AV

ios開發 -- invalid nib registered for identifier

層級關系 註意 刪除 出現 ide 提示 sta tab 後來 今天在寫代碼的時候,碰到這麼一個問題: invalid nib registered for identifier (重用符) - nib must contain exactly one top level

iOS開發Runtime常用示例總結

開發一、構建Runtime測試用例本篇博客的內容是依托於實例的,所以我們在本篇博客中先構建我們的測試類,Runtime將會對該類進行相關的操作。下方就是本篇博客所涉及Demo的目錄,上面的RuntimeKit類是講Runtime常用的功能進行了簡單的封裝,而下方的TestClass以及相關的類目就是我們Run

ios開發Swift新手入門

間距 cati rmi article ride edit ner .com 設置 1、關於swift和調試,swift在ios7.0才支持,ios8.3系統的真機必需要xcode6.3才幹調試。安裝xcode6.3需要os x 10.10以上 2、應用程序由Main.

IOS開發——objectForKey與valueForKey在NSDictionary中的差異

什麽 iat app 報錯信息 lease 方法 去掉 defined atom 從 NSDictionary 取值的時候有兩個方法,objectForKey: 和 valueForKey:,這兩個方法具體有什麽不同呢? 先從 NSDictionary 文檔中來看這兩個方法

ios開發--鍵盤的監聽

efault key nil self. transform blog mar form owa 監聽鍵盤的彈出,讓整個頁面向上移動,比較簡單,僅做記錄使用: 代碼如下: // 監聽鍵盤 [[NSNotificationCenter defaultCenter]

ios開發--CAKeyframeAnimation的詳細用法

edi true nco 創建 rds repeat oval iat ima 簡單的創建一個帶路徑的動畫效果,比較粗糙,不過事先原理都是一樣的, 代碼如下: 1,創建動畫所需的view -(void)creatView { moveView = [UIView

ios開發--CGRect/CGSize/CGPoint/CGVector/CGAffineTransform/UIEdgeInsets/UIOffset和NSString之間的轉換

距離 轉換 nsstring transform ans ins -c cto cnblogs 僅做記錄,一個函數和字符串之間的互相轉換 方法如下: UIKIT_EXTERN NSString *NSStringFromCGPoint(CGPoint point); UI

iOS開發解析XML格式數據

trac pri dsta service ext inset ech dna 們的 XML格式的數據是一種數據的傳輸格式。因為它方便編寫。結構清晰,所以深受程序猿的喜愛,非常多人都喜歡使用XML格式數據傳輸或者作

iOS開發地圖與定位

control 移動 idt line tor mkmapview 什麽 .cn 構建   不管是QQ還是微信的移動client都少不了定位功能,之前在微信demo中沒有加入定位功能,今天就寫個定位的小demo來了解一下定位和地圖的東西。地圖和定位看上去是挺高大

iOS開發使用UICollectionView實現美團App的分類功能【偶現大眾點評App的一個小bug】

sso leg 一個 borde spa line 註意 oba alt 郝萌主傾心貢獻,尊重作者的勞動成果,請勿轉載。假設文章對您有所幫助,歡迎給作者捐贈,支持郝萌主,捐贈數額任意,重在心意^_^ 我要捐贈: 點擊捐贈Cocos2d-X源代碼下載:點我傳送遊戲官方下載

ios開發--UIWebView全屬性

ebe excel 武器 秘密武器 可能 自適應 天氣 2個 ntb 最近的項目當中需要用到html和ios的交互,所以就湊空整理一下,所有webView相關的方法和屬性,如有不對的地方,請大家不吝指教! 代碼如下: 1,創建webview並設置代理 UIWebView

ios開發--系統控件顯示中文

出現 nav ges 進行 code 技術 ava ios urn 雖然一直知道X-code肯定提供有語言本地化的設置地方,但是一直也做個記錄,有些時候的漢化,還是需要使用代碼去控制,鍵盤的右下角、navagiton的return使用代碼修改,調用系統相機時,也是出現英文的

ios開發--UIDocumentInteractionController的使用(實現更多分享服務)

void cnblogs 實例 內容 main 華麗 例如 一個 img 最近在做項目的時候,碰到這樣一個需求,就是本地生成pdf文件,然後本地打開,經過測試發現,pdf文件是無法保存到相冊裏面的,只能存到手機裏面,鑒於蘋果的存儲機制,需要取出來,進行本地展示,可以直接傳到

iOS 開發單例模式

ack pop sel del 結果 通信 方法 ret article 單例就是project中僅僅初始化一次,節省內存空間。或者共享資源。比如在創建藍牙類,或者做WiFi通信時經經常使用到。也能夠用來傳值。 一下介紹兩種創建單例的方法 一,考慮

iOS 開發 FMDB 源碼分析

lob nts st2 current pan mask 數據庫操作 數據庫 nbsp   概念:   FMDB 是用於數據存儲的框架,它是 iOS 平臺下對 SQLite 數據庫的封裝。FMDB 是面向對象的,它以 OC 的方式封裝了 SQLite 的 C 語言 API,

ios開發 -- 自動輪播圖創建

ide targe info self spl enabled static repeat display 這裏是oc版本的,簡單記錄下: 具體代碼如下: 1,準備 #define FRAME [[UIScreen mainScreen] bounds] #define

ios開發--新手引導頁的添加

action spa wal 讀取 sched make property 添加 launch 以往在寫啟動頁面的時候,有時候會直接在啟動頁裏面寫,或者自帶的vc裏面直接寫,但是那樣並不是很方便,啟動頁裏面往往會添加很多的東西,所以封裝成一個單獨的類,可以直接使用,即便是後