जवाबों:
दुर्भाग्य से, stringByAddingPercentEscapesUsingEncoding
हमेशा 100% काम नहीं करता है। यह गैर-URL वर्णों को एनकोड करता है लेकिन आरक्षित वर्णों (जैसे स्लैश /
और एम्परसैंड &
) को अकेला छोड़ देता है। जाहिरा तौर पर यह एक बग है, जिसके बारे में Apple को पता है, लेकिन चूंकि उन्होंने इसे अभी तक ठीक नहीं किया है, इसलिए मैं इस श्रेणी का उपयोग एक स्ट्रिंग-एनलोड करने के लिए कर रहा हूं:
@implementation NSString (NSString_Extended)
- (NSString *)urlencode {
NSMutableString *output = [NSMutableString string];
const unsigned char *source = (const unsigned char *)[self UTF8String];
int sourceLen = strlen((const char *)source);
for (int i = 0; i < sourceLen; ++i) {
const unsigned char thisChar = source[i];
if (thisChar == ' '){
[output appendString:@"+"];
} else if (thisChar == '.' || thisChar == '-' || thisChar == '_' || thisChar == '~' ||
(thisChar >= 'a' && thisChar <= 'z') ||
(thisChar >= 'A' && thisChar <= 'Z') ||
(thisChar >= '0' && thisChar <= '9')) {
[output appendFormat:@"%c", thisChar];
} else {
[output appendFormat:@"%%%02X", thisChar];
}
}
return output;
}
इस तरह इस्तेमाल किया:
NSString *urlEncodedString = [@"SOME_URL_GOES_HERE" urlencode];
// Or, with an already existing string:
NSString *someUrlString = @"someURL";
NSString *encodedUrlStr = [someUrlString urlencode];
यह भी काम करता है:
NSString *encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(
NULL,
(CFStringRef)unencodedString,
NULL,
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8 );
विषय के बारे में कुछ अच्छे पढ़ने:
उद्देश्य-सी iPhone प्रतिशत एक स्ट्रिंग सांकेतिक शब्दों में बदलना?
उद्देश्य-सी और स्विफ्ट URL एन्कोडिंग
http://cybersam.com/programming/proper-url-percent-encoding-in-ios
https://devforums.apple.com/message/15674#15674
http://simonwoodside.com/weblog/2009/4/ 22 / how_to_really_url_encode /
यह मददगार हो सकता है
NSString *sampleUrl = @"http://www.google.com/search.jsp?params=Java Developer";
NSString* encodedUrl = [sampleUrl stringByAddingPercentEscapesUsingEncoding:
NSUTF8StringEncoding];
IOS 7+ के लिए, अनुशंसित तरीका है:
NSString* encodedUrl = [sampleUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
आप URL घटक की आवश्यकता के अनुसार निर्धारित वर्ण चुन सकते हैं।
-stringByAddingPercentEncodingWithAllowedCharacters:
इसके बजाय उपयोग करें , जो हमेशा अनुशंसित UTF-8 एन्कोडिंग का उपयोग करता है, और जो प्रत्येक URL घटक या उपसमुदाय के बाद से एक विशिष्ट URL घटक या उपसंकेत के लिए एन्कोड करता है, जो वर्ण मान्य हैं के लिए अलग-अलग नियम हैं।"
उत्तर चुने जाने के बाद से नए एपीआई जोड़े गए हैं; अब आप NSURLUtilities का उपयोग कर सकते हैं। चूंकि URL के विभिन्न भाग विभिन्न वर्णों को अनुमति देते हैं, इसलिए लागू वर्ण सेट का उपयोग करें। निम्नलिखित उदाहरण क्वेरी स्ट्रिंग में शामिल करने के लिए एन्कोड करता है:
encodedString = [myString stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet];
विशेष रूप से 'और' को परिवर्तित करने के लिए, आपको URL क्वेरी सेट से इसे निकालने या किसी अन्य सेट का उपयोग करने की आवश्यकता होगी, क्योंकि URL क्वेरी में '&' की अनुमति है:
NSMutableCharacterSet *chars = NSCharacterSet.URLQueryAllowedCharacterSet.mutableCopy;
[chars removeCharactersInRange:NSMakeRange('&', 1)]; // %26
encodedString = [myString stringByAddingPercentEncodingWithAllowedCharacters:chars];
NSMakeRange('&', 1)
स्विफ्ट में काम नहीं करता है, क्योंकि स्विफ्ट चार को बिना हैक्स के इंट कन्वर्जन की अनुमति नहीं देता है। इस समाधान का उपयोग स्विफ्ट कोड में removeCharactersInString("&")
करने के लिए.removeCharactersInRange(...)
स्विफ्ट 2.0 का उदाहरण (iOS 9 कम्पेटिबल)
extension String {
func stringByURLEncoding() -> String? {
let characters = NSCharacterSet.URLQueryAllowedCharacterSet().mutableCopy() as! NSMutableCharacterSet
characters.removeCharactersInString("&")
guard let encodedString = self.stringByAddingPercentEncodingWithAllowedCharacters(characters) else {
return nil
}
return encodedString
}
}
आईओएस 7 अपडेट
NSString *encode = [string stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
NSString *decode = [encode stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
मैंने CFURLCreateStringByAddingPercentEscapes
कॉल को स्वीकार किए गए उत्तर के रूप में उपयोग करने का विकल्प चुना , हालांकि XCode (IOS) के नवीनतम संस्करण में, इसके परिणामस्वरूप त्रुटि हुई, इसलिए इसके बजाय निम्नलिखित का उपयोग किया:
NSString *apiKeyRaw = @"79b|7Qd.jW=])(fv|M&W0O|3CENnrbNh4}2E|-)J*BCjCMrWy%dSfGs#A6N38Fo~";
NSString *apiKey = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)apiKeyRaw, NULL, (CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8));
इसके stringByAddingPercentEncodingWithAllowedCharacters
साथ विधि का उपयोग करने का प्रयास करें [NSCharacterSet URLUserAllowedCharacterSet]
यह सभी मामलों को कवर करेगा
उद्देश्य सी
NSString *value = @"Test / Test";
value = [value stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLUserAllowedCharacterSet]];
तीव्र
var value = "Test / Test"
value.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLUserAllowedCharacterSet())
उत्पादन
Test%20%2F%20Test
इस विषय के सभी उत्तरों और गलत ( गलत ) को स्वीकार करने के बाद, मैं अपना योगदान जोड़ना चाहता हूं।
अगर लक्ष्य iOS7 + है, और 2017 में यह तब से होना चाहिए क्योंकि XCode को iOS8 के तहत संगतता प्रदान करना वास्तव में कठिन है, सबसे अच्छा तरीका है, थ्रेड सुरक्षित, तेज, amd यह करने के लिए पूरा UTF-8 समर्थन करेगा:
(उद्देश्य सी कोड)
@implementation NSString (NSString_urlencoding)
- (NSString *)urlencode {
static NSMutableCharacterSet *chars = nil;
static dispatch_once_t pred;
if (chars)
return [self stringByAddingPercentEncodingWithAllowedCharacters:chars];
// to be thread safe
dispatch_once(&pred, ^{
chars = NSCharacterSet.URLQueryAllowedCharacterSet.mutableCopy;
[chars removeCharactersInString:@"!*'();:@&=+$,/?%#[]"];
});
return [self stringByAddingPercentEncodingWithAllowedCharacters:chars];
}
@end
यह NSString का विस्तार करेगा, RFC निषिद्ध वर्णों को बाहर करेगा, UTF-8 वर्णों का समर्थन करेगा, और आपको निम्नलिखित चीजों का उपयोग करने देगा:
NSString *myusername = "I'm[evil]&want(to)break!!!$->àéìòù";
NSLog(@"Source: %@ -> Dest: %@", myusername, [myusername urlencode]);
यह आपके डिबग कंसोल पर प्रिंट होगा:
स्रोत: मैं [दुष्ट] हूं और चाहता हूं (तोड़ना) !!! $ -> अब -> गंतव्य: I% २m मीटर % A0% C3% A9% C3% एसी% C3% B2% C3% B9
... यह भी ध्यान दें कि मल्टीथ्रेड वातावरण में कई आरंभीकरण से बचने के लिए डिस्पैच_ऑन का उपयोग करें।
यहाँ स्विफ्ट 5.x में एक उत्पादन-तैयार लचीला दृष्टिकोण है :
public extension CharacterSet {
static let urlQueryParameterAllowed = CharacterSet.urlQueryAllowed.subtracting(CharacterSet(charactersIn: "&?"))
static let urlQueryDenied = CharacterSet.urlQueryAllowed.inverted()
static let urlQueryKeyValueDenied = CharacterSet.urlQueryParameterAllowed.inverted()
static let urlPathDenied = CharacterSet.urlPathAllowed.inverted()
static let urlFragmentDenied = CharacterSet.urlFragmentAllowed.inverted()
static let urlHostDenied = CharacterSet.urlHostAllowed.inverted()
static let urlDenied = CharacterSet.urlQueryDenied
.union(.urlQueryKeyValueDenied)
.union(.urlPathDenied)
.union(.urlFragmentDenied)
.union(.urlHostDenied)
func inverted() -> CharacterSet {
var copy = self
copy.invert()
return copy
}
}
public extension String {
func urlEncoded(denying deniedCharacters: CharacterSet = .urlDenied) -> String? {
return addingPercentEncoding(withAllowedCharacters: deniedCharacters.inverted())
}
}
print("Hello, World!".urlEncoded()!)
print("You&Me?".urlEncoded()!)
print("#Blessed 100%".urlEncoded()!)
print("Pride and Prejudice".urlEncoded(denying: .uppercaseLetters)!)
Hello,%20World!
You%26Me%3F
%23Blessed%20100%25
%50ride and %50rejudice
HTTP GET मापदंडों को एनकोड करने के लिए NSURLCompords का उपयोग करें:
var urlComponents = NSURLComponents(string: "https://www.google.de/maps/")!
urlComponents.queryItems = [
NSURLQueryItem(name: "q", value: String(51.500833)+","+String(-0.141944)),
NSURLQueryItem(name: "z", value: String(6))
]
urlComponents.URL // returns https://www.google.de/maps/?q=51.500833,-0.141944&z=6
http://www.ralfebert.de/snippets/ios/encoding-nsurl-get-parameters/
इस कोड ने मुझे विशेष पात्रों को एन्कोड करने में मदद की
NSString* encPassword = [password stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet alphanumericCharacterSet]];
इस धागे में chown के objc उत्तर पर आधारित स्विफ्ट कोड ।
extension String {
func urlEncode() -> String {
return CFURLCreateStringByAddingPercentEscapes(
nil,
self,
nil,
"!*'();:@&=+$,/?%#[]",
CFStringBuiltInEncodings.UTF8.rawValue
)
}
}
में स्विफ्ट 3 , नीचे बाहर का प्रयास करें:
let stringURL = "YOUR URL TO BE ENCODE";
let encodedURLString = stringURL.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
print(encodedURLString)
चूंकि, stringByAddingPercentEscapesUsingEncoding
गैर URL वर्णों को एनकोड करता है , लेकिन आरक्षित वर्णों को छोड़ देता है (जैसे !*'();:@&=+$,/?%#[]
), आप निम्न कोड की तरह url को एन्कोड कर सकते हैं:
let stringURL = "YOUR URL TO BE ENCODE";
let characterSetTobeAllowed = (CharacterSet(charactersIn: "!*'();:@&=+$,/?%#[] ").inverted)
if let encodedURLString = stringURL.addingPercentEncoding(withAllowedCharacters: characterSetTobeAllowed) {
print(encodedURLString)
}
स्विफ्ट 3 में:
// exclude alpha and numeric == "full" encoding
stringUrl = stringUrl.addingPercentEncoding(withAllowedCharacters: .alphanumerics)!;
// exclude hostname and symbols &,/ and etc
stringUrl = stringUrl.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!;
10.11 रिलीज़ नोट में Apple की सलाह है:
यदि आपको संपूर्ण URL स्ट्रिंग को प्रतिशत-एन्कोड करने की आवश्यकता है, तो आप इस कोड का उपयोग URL (URL में urlStringToEncode) करने के लिए एनएसएसट्रिंग को एनकोड करने के लिए कर सकते हैं:
NSString *percentEncodedURLString =
[[NSURL URLWithDataRepresentation:[urlStringToEncode dataUsingEncoding:NSUTF8StringEncoding] relativeToURL:nil] relativeString];
मेरे मामले में जहां अंतिम घटक अरबी पत्र थे, मैंने निम्नलिखित कार्य किए 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;
}
}
उपयोग:
let stringURL = "http://xxx.dev.com/endpoint/nonLatinCharacters"
if let encodedStringURL = stringURL.encodeUTF8() {
if let url = NSURL(string: encodedStringURL) {
...
}
}
-(NSString *)encodeUrlString:(NSString *)string {
return CFBridgingRelease(
CFURLCreateStringByAddingPercentEscapes(
kCFAllocatorDefault,
(__bridge CFStringRef)string,
NULL,
CFSTR("!*'();:@&=+$,/?%#[]"),
kCFStringEncodingUTF8)
);
}
निम्नलिखित ब्लॉग के अनुसार
इतने सारे जवाब लेकिन मेरे लिए काम नहीं किया, इसलिए मैंने निम्नलिखित कोशिश की:
fun simpleServiceCall(for serviceUrl: String, appendToUrl: String) {
let urlString: String = serviceUrl + appendToUrl.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed)!
let finalUrl = URL(string: urlString)!
//continue to execute your service call...
}
उम्मीद है कि यह किसी की मदद करेगा। धन्यवाद
व्यक्तिगत www फ़ॉर्म-एन्कोडेड क्वेरी पैरामीटर के लिए, मैंने NSString पर एक श्रेणी बनाई:
- (NSString*)WWWFormEncoded{
NSMutableCharacterSet *chars = NSCharacterSet.alphanumericCharacterSet.mutableCopy;
[chars addCharactersInString:@" "];
NSString* encodedString = [self stringByAddingPercentEncodingWithAllowedCharacters:chars];
encodedString = [encodedString stringByReplacingOccurrencesOfString:@" " withString:@"+"];
return encodedString;
}
// यह परीक्षण के बिना है
NSMutableCharacterSet* set = [[NSCharacterSet alphanumericCharacterSet] mutableCopy];
[set addCharactersInString:@"-_.~"];
NSString *encode = [test stringByAddingPercentEncodingWithAllowedCharacters:set];
मुझे POST पैरामीटर के रूप में जटिल तारों को पारित करने में एक समान समस्या का सामना करना पड़ा। मेरे तार में एशियाई वर्ण, रिक्त स्थान, उद्धरण और सभी प्रकार के विशेष वर्ण हो सकते हैं। आखिरकार मुझे जो समाधान मिला वह था यूनिकोड की मिलान श्रृंखला में अपने स्ट्रिंग को परिवर्तित करना, जैसे "Hu0040Hu0020Hu03f5 ...." [NSString stringWithFormat: @ "Hu% 04x", [string characterAtIndex: i]] का उपयोग करके प्रत्येक से यूनिकोड प्राप्त करना। मूल स्ट्रिंग में चरित्र। वही जावा में किया जा सकता है।
इस स्ट्रिंग को POST पैरामीटर के रूप में सुरक्षित रूप से पारित किया जा सकता है।
सर्वर साइड (PHP) पर, मैं सभी "H" को "\" में बदलता हूं और परिणामी स्ट्रिंग को json_decode पर पास करता हूं। अंतिम चरण MySQL में स्ट्रिंग को स्टोर करने से पहले सिंगल कोट्स से बचना है।
इस तरह मैं अपने सर्वर पर किसी भी UTF8 स्ट्रिंग को स्टोर कर सकता हूं।
यह एक मेरे लिए काम कर रहा है।
func stringByAddingPercentEncodingForFormData(plusForSpace: Bool=false) -> String? {
let unreserved = "*-._"
let allowed = NSMutableCharacterSet.alphanumericCharacterSet()
allowed.addCharactersInString(unreserved)
if plusForSpace {
allowed.addCharactersInString(" ")
}
var encoded = stringByAddingPercentEncodingWithAllowedCharacters(allowed)
if plusForSpace {
encoded = encoded?.stringByReplacingOccurrencesOfString(" ",
withString: "+")
}
return encoded
}
मुझे इस लिंक से उपरोक्त फ़ंक्शन मिला: http://useyourloaf.com/blog/how-to-percent-encode-a-url-string/
आप इस फ़ंक्शन का उपयोग तेजी से विस्तार के साथ भी कर सकते हैं। कृपया मुझे बताएं कि क्या कोई समस्या है।