IB9 में stringByAddingPercentEscapesUsingEncoding के लिए प्रतिस्थापन?


112

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?

जवाबों:


131

पदावनत संदेश कहते हैं (जोर मेरा):

इसके बजाय stringByAddingPercentEncodingWithAllowedCharacters (_ :) का उपयोग करें, जो हमेशा अनुशंसित UTF-8 एन्कोडिंग का उपयोग करता है , और जो प्रत्येक URL घटक या उपसमुदाय के बाद से किसी विशिष्ट URL घटक या उपसंकेत के लिए एन्कोड करता है, जो वर्ण मान्य हैं के लिए अलग नियम हैं।

तो आपको केवल NSCharacterSetतर्क के रूप में एक पर्याप्त आपूर्ति करने की आवश्यकता है । सौभाग्य से, URL के लिए एक बहुत ही आसान वर्ग विधि है जिसे URLHostAllowedCharacterSetआप इस तरह से उपयोग कर सकते हैं:

let encodedHost = unencodedHost.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())

स्विफ्ट 3 के लिए अपडेट - विधि स्थिर संपत्ति बन जाती है urlHostAllowed:

let encodedHost = unencodedHost.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)

हालांकि, जागरूक रहें:

यह विधि किसी URL घटक या उप-कंपोनेंट स्ट्रिंग को प्रतिशत-एन्कोड करने के उद्देश्य से है, संपूर्ण URL स्ट्रिंग नहीं।


6
इसके अलावा, मैं दृढ़ता से उपयोग करने का सुझाव दूंगा NSURLComponents, जो आपके लिए प्रतिशत-एन्कोडिंग को संभाल सकता है।
एंटोनियो फवाटा

1
संपूर्ण URL स्ट्रिंग के लिए क्या उपयोग करना है, इसके लिए कोई सुझाव?
कौशल एम 2

1
@ SkillM2 मुझे लगता है NSURLComponents(प्रत्येक घटक प्रतिशत के साथ-साथ इनकोडेड NSCharacterSet) जाने का सही तरीका है।
एंटोनियो फवाटा

2
आपको कभी भी, कभी भी, पूरे URL स्ट्रिंग को एनकोड करने का प्रयास नहीं करना चाहिए। यह अप्रत्याशित बग पैदा कर सकता है, और कुछ मामलों में, सुरक्षा छेद। URL को एन्कोड करने का एकमात्र गारंटीकृत सही तरीका है कि इसे एक बार में एक टुकड़ा किया जाए।
dgatwood

महान। बहुत बहुत धन्यवाद, दोस्त!
फेलिप

100

उद्देश्य-सी : के लिए

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 स्ट्रिंग नहीं।


4
मुझे प्यार है जब Apple जीवन को आसान बनाता है। धन्यवाद सेब।
बतख

5
"इस पद्धति का अभिप्राय यह है कि URL घटक या उपसंयोजक स्ट्रिंग को प्रतिशत-सांकेतिक शब्दों में बदलना है, संपूर्ण URL स्ट्रिंग नहीं है।" ?
GeneCode

4
URLHostAllowedCharacterSet "असमर्थित URL" त्रुटि दे रहा था, मैंने URLFragmentAllowedCharacterSet और इसके ठीक काम का उपयोग किया।
अनूप

1
यह + के साथ काम नहीं करता है और यह इसे एनकोड नहीं करेगा और इसे स्पेसिफिकेशंस के अनुसार सर्वर साइड में बदल दिया जाएगा।
तोरजे

45

URLHostAllowedCharacterSetहै काम नहीं मेरे लिए। मैं URLFragmentAllowedCharacterSetइसके बजाय का उपयोग करें ।

उद्देश्य सी

NSCharacterSet *set = [NSCharacterSet URLFragmentAllowedCharacterSet];
NSString * encodedString = [@"url string" stringByAddingPercentEncodingWithAllowedCharacters:set];

स्विफ्ट - 4

"url string".addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)

निम्नलिखित उपयोगी (उल्टे) वर्ण सेट हैं:

URLFragmentAllowedCharacterSet  "#%<>[\]^`{|}
URLHostAllowedCharacterSet      "#%/<>?@\^`{|}
URLPasswordAllowedCharacterSet  "#%/:<>?@[\]^`{|}
URLPathAllowedCharacterSet      "#%;<>?[\]^`{|}
URLQueryAllowedCharacterSet     "#%<>[\]^`{|}
URLUserAllowedCharacterSet      "#%/:<>?@[\]^`

धन्यवाद और आपके लिए भी
अर्पित बी पारेख

यह देखते हुए कि इनमें से कोई भी सेट शामिल नहीं है +। यदि स्ट्रिंग पैरामीटर में पारित किया जाता है, तो स्ट्रिंग में प्लस संकेतों को गड़बड़ किया जाएगा - सर्वर साइड पर अंतरिक्ष `` के रूप में माना जाता है।
असमो सोइनियो

21

उद्देश्य सी

यह कोड मेरे लिए काम करता है:

urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];

4

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;
}
}

2

स्विफ्ट 3.0 के लिए

आप urlHostAllowedcharacterSet का उपयोग कर सकते हैं ।

/// किसी होस्ट URL उपसंपत्ति में अनुमत वर्णों के लिए सेट वर्ण लौटाता है।

public static var urlHostAllowed: CharacterSet { get }

WebserviceCalls.getParamValueStringForURLFromDictionary(settingsDict as! Dictionary<String, AnyObject>).addingPercentEncoding(withAllowedCharacters: CharacterSet.urlHostAllowed)

1

"इस पद्धति का अभिप्राय यह है कि URL घटक या उपसंयोजक स्ट्रिंग को प्रतिशत-सांकेतिक शब्दों में बदलना है, संपूर्ण URL स्ट्रिंग नहीं है।" ? - 8:30 बजे GeneCode Sep 1 '16

इसका मतलब यह है कि आप https://xpto.example.com/path/subpathurl के सांकेतिक शब्दों में बदलना करने के लिए नहीं कर रहे हैं , लेकिन केवल के बाद क्या जाता है ?

माना जाता है, क्योंकि मामलों में ऐसा करने के लिए उपयोग-मामले हैं:

https://example.com?redirectme=xxxxx

जहां xxxxxपूरी तरह से एन्कोडेड URL है।


0

स्वीकृत उत्तर में जोड़ना। इस नोट को ध्यान में रखते हुए

यह विधि किसी URL घटक या उप-कंपोनेंट स्ट्रिंग को प्रतिशत-एन्कोड करने के उद्देश्य से है, संपूर्ण URL स्ट्रिंग नहीं।

पूरे URL को एन्कोड नहीं किया जाना चाहिए:

let param = "=color:green|\(latitude),\(longitude)&\("zoom=13&size=\(width)x\(height)")&sensor=true&key=\(staticMapKey)".addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) 
let url = "https://maps.google.com/maps/api/staticmap?markers" + param!
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.