一、背景。
將以下地址請求服務器時,如果postUrl中某個參數值包含符號+? 那么在服務器獲取到這個參數值時,其加號變成了一個空格。
NSString *postUrl = "http地址";
postUrl = [postUrl stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
二、原因。
是因為當這個地址進行以上編碼時并沒有對加號進行處理,正常情況下地址中的加號應該被轉碼成%2B
三、解決方法。
[postUrl stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]已經是iOS過時的方法,應該是存在問題的,所以IOS不建議用。
應該采用方法:
postUrl = [postUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:@"#%<>[\\]^`{|}\"]+"].invertedSet];
其中方法[NSCharacterSet characterSetWithCharactersInString:@"#%<>[\\]^`{|}\"]+"]中的字符串"【#%<>[\\]^`{|}\"]+】用戶可自定義,代表的意思是需要對這些特殊字符進行轉碼。里面包含了加號,當然就沒問題了。
【擴展】
除了自定義,IOS也提供了幾個枚舉值,代表的特殊字符以及調用方法如下:
[java] view plain copy
URLFragmentAllowedCharacterSet? "#%<>[\]^`{|}
URLHostAllowedCharacterSet? ? ? "#%/<>?@\^`{|}
URLPasswordAllowedCharacterSet? "#%/:<>?@[\]^`{|}
URLPathAllowedCharacterSet? ? ? "#%;<>?[\]^`{|}
URLQueryAllowedCharacterSet? ? "#%<>[\]^`{|}
URLUserAllowedCharacterSet? ? ? "#%/:<>?@[\]^`
調用:
postUrl = [postUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
【看到別人的文章說是轉的,沒注明轉自哪里,我也不知道原文是哪個,轉來分享給大家】
另外我自己改的一種方法是,問題原因因為“+”號 會被當成空格傳給服務器,而正確的+號應該被轉成%2B,所以 在url里面 直接replace成%2B 傳到服務器也是正確的