Замена для 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
?
7 ответов:
в сообщении об осуждении говорится (акцент мой):
вместо этого используйте stringByAddingPercentEncodingWithallowedcharacters (_:),, который всегда использует рекомендуемую кодировку UTF-8, и который кодирует для конкретного компонента URL или подкомпонента, поскольку каждый компонент URL или подкомпонент имеет разные правила для допустимых символов.
так что вам нужно только поставить адекватный
NSCharacterSet
в качестве аргумента. К счастью, для URL-адресов есть очень удобный метод класса называетсяURLHostAllowedCharacterSet
что вы можете использовать такой:let encodedHost = unencodedHost.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
обновление Swift 3 -- метод становится статическим свойством
urlHostAllowed
:let encodedHost = unencodedHost.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
имейте в виду, однако, что:
этот метод предназначен для процентного кодирования компонента URL или строки подкомпонента, а не всей строки URL.
Для Цели-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.
URLHostAllowedCharacterSet
- это НЕ РАБОТАЕТ ДЛЯ МЕНЯ. Я использую .С
NSCharacterSet *set = [NSCharacterSet URLFragmentAllowedCharacterSet]; NSString * encodedString = [@"url string" stringByAddingPercentEncodingWithAllowedCharacters:set];
SWIFT-4
"url string".addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
следующие полезные (инвертированные) наборы символов:
URLFragmentAllowedCharacterSet "#%<>[\]^`{|} URLHostAllowedCharacterSet "#%/<>?@\^`{|} URLPasswordAllowedCharacterSet "#%/:<>?@[\]^`{|} URLPathAllowedCharacterSet "#%;<>?[\]^`{|} URLQueryAllowedCharacterSet "#%<>[\]^`{|} URLUserAllowedCharacterSet "#%/:<>?@[\]^`
С
этот код работает для меня :
urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];
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 { == "/" }.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() }.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; } }
Для Swift 3.0
можно использовать
urlHostAllowed
набор символов./// возвращает набор символов для символов, разрешенных в субкомпоненте URL узла.
public static var urlHostAllowed: CharacterSet { get } WebserviceCalls.getParamValueStringForURLFromDictionary(settingsDict as! Dictionary<String, AnyObject>).addingPercentEncoding(withAllowedCharacters: CharacterSet.urlHostAllowed)
что означает " этот метод предназначен для процентного кодирования компонента URL или строки подкомпонента, а не всей строки URL."? - GeneCode Sep 1 ' 16 в 8: 30
Это означает, что вы не должны закодировать
https://xpto.example.com/path/subpath
url, но только то, что идет после?
.предполагается, потому что есть прецеденты для этого в таких случаях, как:
https://example.com?redirectme=xxxxx
здесь
xxxxx
- это полностью закодированный URL-адрес.