Замена для stringByAddingPercentEscapesUsingEncoding в ios9?
В iOS8 и ранее я могу использовать:
NSString *str = ...; // some URL
NSString *result = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
в iOS9 stringByAddingPercentEscapesUsingEncoding
заменен на stringByAddingPercentEncodingWithAllowedCharacters
:
NSString *str = ...; // some URL
NSCharacterSet *set = ???; // where to find set for NSUTF8StringEncoding?
NSString *result = [str stringByAddingPercentEncodingWithAllowedCharacters:set];
и мой вопрос: где найти нужную NSCharacterSet
(NSUTF8StringEncoding
) для правильной замены stringByAddingPercentEscapesUsingEncoding
?
Ответы
Ответ 1
В сообщении об устаревании говорится (основное внимание):
Использовать stringByAddingPercentEncodingWithAllowedCharacters (_:) вместо этого, , который всегда использует рекомендуемую кодировку UTF-8, и которая кодирует определенный компонент или подкомпонент URL, поскольку каждый компонент или подкомпонент URL имеет разные правила для символов действительны.
Таким образом, вам нужно предоставить достаточный аргумент NSCharacterSet
в качестве аргумента. К счастью, для URL-адресов существует очень удобный метод класса URLHostAllowedCharacterSet
, который можно использовать следующим образом:
let encodedHost = unencodedHost.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
Обновление для Swift 3 - метод становится статическим свойством urlHostAllowed
:
let encodedHost = unencodedHost.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
Помните, что:
Этот метод предназначен для процентного кодирования URL-компонента или подкомпонента, а не всей строки URL-адреса.
Ответ 2
Для Objective-C:
NSString *str = ...; // some URL
NSCharacterSet *set = [NSCharacterSet URLHostAllowedCharacterSet];
NSString *result = [str stringByAddingPercentEncodingWithAllowedCharacters:set];
Где найти набор для NSUTF8StringEncoding?
Существуют предопределенные наборы символов для шести компонентов URL и подкомпонентов, которые позволяют кодировать проценты. Эти наборы символов передаются на -stringByAddingPercentEncodingWithAllowedCharacters:
.
// Predefined character sets for the six URL components and subcomponents which allow percent encoding. These character sets are passed to -stringByAddingPercentEncodingWithAllowedCharacters:.
@interface NSCharacterSet (NSURLUtilities)
+ (NSCharacterSet *)URLUserAllowedCharacterSet;
+ (NSCharacterSet *)URLPasswordAllowedCharacterSet;
+ (NSCharacterSet *)URLHostAllowedCharacterSet;
+ (NSCharacterSet *)URLPathAllowedCharacterSet;
+ (NSCharacterSet *)URLQueryAllowedCharacterSet;
+ (NSCharacterSet *)URLFragmentAllowedCharacterSet;
@end
В сообщении об устаревании говорится (основное внимание):
Использовать stringByAddingPercentEncodingWithAllowedCharacters (_:) вместо этого, , который всегда использует рекомендуемую кодировку UTF-8, и которая кодирует определенный компонент или подкомпонент URL, поскольку каждый компонент или подкомпонент URL имеет разные правила для символов действительны.
Поэтому вам нужно только предоставить адекватный аргумент NSCharacterSet
. К счастью, для URL-адресов существует очень удобный метод класса URLHostAllowedCharacterSet
, который можно использовать следующим образом:
NSCharacterSet *set = [NSCharacterSet URLHostAllowedCharacterSet];
Помните, что:
Этот метод предназначен для процентного кодирования URL-компонента или подкомпонента, а не всей строки URL-адреса.
Ответ 3
URLHostAllowedCharacterSet
НЕ РАБОТАЕТ ДЛЯ МЕНЯ. Вместо этого я использую URLFragmentAllowedCharacterSet
.
ОБЪЕКТИВ -C
NSCharacterSet *set = [NSCharacterSet URLFragmentAllowedCharacterSet];
NSString * encodedString = [@"url string" stringByAddingPercentEncodingWithAllowedCharacters:set];
Следующие полезные (инвертированные) наборы символов:
URLFragmentAllowedCharacterSet "#%<>[\]^`{|}
URLHostAllowedCharacterSet "#%/<>[email protected]\^`{|}
URLPasswordAllowedCharacterSet "#%/:<>[email protected][\]^`{|}
URLPathAllowedCharacterSet "#%;<>?[\]^`{|}
URLQueryAllowedCharacterSet "#%<>[\]^`{|}
URLUserAllowedCharacterSet "#%/:<>[email protected][\]^`
Ответ 4
Objective-C
этот код работает для меня:
urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];
Ответ 5
Swift 2.2:
extension String {
func encodeUTF8() -> String? {
//If I can create an NSURL out of the string nothing is wrong with it
if let _ = NSURL(string: self) {
return self
}
//Get the last component from the string this will return subSequence
let optionalLastComponent = self.characters.split { $0 == "/" }.last
if let lastComponent = optionalLastComponent {
//Get the string from the sub sequence by mapping the characters to [String] then reduce the array to String
let lastComponentAsString = lastComponent.map { String($0) }.reduce("", combine: +)
//Get the range of the last component
if let rangeOfLastComponent = self.rangeOfString(lastComponentAsString) {
//Get the string without its last component
let stringWithoutLastComponent = self.substringToIndex(rangeOfLastComponent.startIndex)
//Encode the last component
if let lastComponentEncoded = lastComponentAsString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.alphanumericCharacterSet()) {
//Finally append the original string (without its last component) to the encoded part (encoded last component)
let encodedString = stringWithoutLastComponent + lastComponentEncoded
//Return the string (original string/encoded string)
return encodedString
}
}
}
return nil;
}
}
Ответ 6
Для Swift 3.0
Вы можете использовать urlHostAllowed
characterSet.
///Возвращает набор символов для символов, разрешенных в подкомпоненте URL-адреса хоста.
public static var urlHostAllowed: CharacterSet { get }
WebserviceCalls.getParamValueStringForURLFromDictionary(settingsDict as! Dictionary<String, AnyObject>).addingPercentEncoding(withAllowedCharacters: CharacterSet.urlHostAllowed)
Ответ 7
В чем смысл "Этот метод предназначен для процентного кодирования URL-компонента или подкомпонента, а не всей строки URL-адреса".? - GeneCode Sep 1 '16 в 8:30
Это означает, что вы не должны кодировать https://xpto.example.com/path/subpath
URL-адреса, но только то, что идет после ?
.
Предполагается, что для этого используются прецеденты:
https://example.com?redirectme=xxxxx
Где xxxxx
- полностью закодированный URL.