উত্তর:
দুর্ভাগ্যক্রমে, stringByAddingPercentEscapesUsingEncoding
সর্বদা 100% কাজ করে না। এটি নন-ইউআরএল অক্ষরগুলিকে এনকোড করে তবে সংরক্ষিত অক্ষরগুলি (যেমন স্ল্যাশ /
এবং এম্পারস্যান্ড &
) একা ফেলে দেয়। আপাতদৃষ্টিতে এটি একটি বাগ যা অ্যাপল সচেতন, কিন্তু যেহেতু তারা এখনও এটি স্থির করেনি, তাই আমি একটি স্ট্রিং url-encod করতে এই বিভাগটি ব্যবহার করছি:
@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 );
বিষয় সম্পর্কে কিছু ভাল পড়া:
উদ্দেশ্য-সি আইফোন শতাংশ একটি স্ট্রিং এনকোড?
উদ্দেশ্য-সি এবং সুইফট ইউআরএল এনকোডিং
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];
আইওএস 7+ এর জন্য, প্রস্তাবিত উপায়টি হ'ল:
NSString* encodedUrl = [sampleUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
আপনি ইউআরএল উপাদানগুলির প্রয়োজনীয়তা অনুসারে অনুমোদিত অক্ষর সেটটি চয়ন করতে পারেন।
-stringByAddingPercentEncodingWithAllowedCharacters:
পরিবর্তে ব্যবহার করুন, যা সর্বদা প্রস্তাবিত ইউটিএফ -8 এনকোডিং ব্যবহার করে এবং যে কোনও ইউআরএল উপাদান বা উপ-সংস্থার জন্য এনকোড থাকে যেহেতু প্রতিটি ইউআরএল উপাদান বা উপ-উপাদানটি অক্ষরগুলি বৈধ কিনা তার জন্য বিভিন্ন বিধি রয়েছে" "
উত্তরটি নির্বাচিত হওয়ার পরে নতুন এপিআই যুক্ত করা হয়েছে; আপনি এখন এনএসআরএল ইউটিলিটিগুলি ব্যবহার করতে পারেন। যেহেতু ইউআরএল এর বিভিন্ন অংশ বিভিন্ন বর্ণকে অনুমতি দেয় তাই প্রযোজ্য অক্ষর সেটটি ব্যবহার করুন। নিম্নলিখিত উদাহরণটি ক্যোয়ারী স্ট্রিংয়ের অন্তর্ভুক্তির জন্য এনকোডগুলি:
encodedString = [myString stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet];
বিশেষত '&' রুপান্তর করতে, আপনাকে ইউআরএল কোয়েরি সেট থেকে এটি সরিয়ে ফেলতে হবে বা একটি আলাদা সেট ব্যবহার করতে হবে, যেমন ইউআরএল কোয়েরিতে '&' এর অনুমতি রয়েছে:
NSMutableCharacterSet *chars = NSCharacterSet.URLQueryAllowedCharacterSet.mutableCopy;
[chars removeCharactersInRange:NSMakeRange('&', 1)]; // %26
encodedString = [myString stringByAddingPercentEncodingWithAllowedCharacters:chars];
NSMakeRange('&', 1)
সুইফটে কাজ করে না, কারণ সুইফট হ্যাক ছাড়াই চরকে ইন্টার রূপান্তর করতে দেয় না। এই সমাধানটি সুইফ্ট removeCharactersInString("&")
.removeCharactersInRange(...)
সুইফট 2.0 উদাহরণ (আইওএস 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
স্বীকৃত উত্তর দ্বারা প্রদত্ত কলটি ব্যবহার করার সিদ্ধান্ত নিয়েছি , তবে এক্সকোডের (এবং আইওএস) সর্বশেষতম সংস্করণে এটির একটি ত্রুটি ঘটেছে, সুতরাং এর পরিবর্তে নিম্নলিখিতটি ব্যবহার করুন:
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 আইওএস 8 এর অধীনে সামঞ্জস্যতা সরবরাহ করা সত্যিই কঠিন করা উচিত, সবচেয়ে ভাল উপায়, থ্রেড নিরাপদ, দ্রুত, এএমডি এটি করার জন্য ইউটিএফ -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
এটি এনএসএসস্ট্রিং প্রসারিত করবে, আরএফসি নিষিদ্ধ অক্ষর বাদ দেবে, ইউটিএফ -8 অক্ষরকে সমর্থন করবে এবং আপনাকে এই জাতীয় জিনিস ব্যবহার করতে দিন:
NSString *myusername = "I'm[evil]&want(to)break!!!$->àéìòù";
NSLog(@"Source: %@ -> Dest: %@", myusername, [myusername urlencode]);
এটি আপনার ডিবাগ কনসোলটিতে মুদ্রণ করবে:
উত্স: আমি [অশুভ] এবং ব্রেক করতে চাই ())>> -> àéìòù -> লক্ষ্য: আমি% 27 মি% 5 বিভিল% 5 ডি% 26 ভাই% 28to% 29 ভঙ্গ% 21% 21% 21% 24-% 3E% সি 3 % A0% C3 এ% A9% C3 এ% এসি% C3 এ% B2 তে% C3 এ% B9
... মাল্টিথ্রিড পরিবেশে একাধিক সূচনা এড়ানোর জন্য ডিসপ্যাচ_অনসের ব্যবহারটিও নোট করুন note
সুইফট ৫.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
এইচটিটিপি জিইটি প্যারামিটারগুলি এনকোড করতে এনএসআরএল উপাদানগুলি ব্যবহার করুন:
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]];
SWIFT কোড উপর ভিত্তি করে chown 'এই থ্রেড objc উত্তর s।
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
ইউআরএল অক্ষরগুলি এনকোড করে তবে সংরক্ষিত অক্ষরগুলি (যেমন !*'();:@&=+$,/?%#[]
) ছেড়ে যায় , আপনি নিম্নলিখিত কোডের মতো ইউআরএল এনকোড করতে পারেন:
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 রিলিজ নোটে অ্যাপলের পরামর্শটি হ'ল:
আপনার যদি একটি সম্পূর্ণ ইউআরএল স্ট্রিংটি শতাংশ-এনকোড করার দরকার হয় তবে আপনি এই কোডটি কোনও ইউআরএল হওয়ার উদ্দেশ্যে এনএসটিস্ট্রিংকে এনকোড করতে ব্যবহার করতে পারেন (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*)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];
পোষ্ট প্যারামিটার হিসাবে জটিল স্ট্রিংগুলি পাস করার ক্ষেত্রে আমি একই ধরণের সমস্যার মুখোমুখি হয়েছি। আমার স্ট্রিংগুলিতে এশীয় অক্ষর, স্পেস, কোট এবং সমস্ত ধরণের বিশেষ অক্ষর থাকতে পারে। শেষ পর্যন্ত আমি যে সমাধানটি পেয়েছি তা হ'ল আমার স্ট্রিংটিকে ইউনিকোডের মিলের সিরিজে রূপান্তর করা, যেমন "Hu0040Hu0020Hu03f5 ...." ব্যবহার করে [এনএসএস স্ট্রিং উইথফর্ম্যাট: @ "হু% 04x", [স্ট্রিং চরিত্রআটিআইন্ডেক্স: i]] প্রতিটি থেকে ইউনিকোড পাওয়ার জন্য মূল স্ট্রিংয়ের অক্ষর। জাভাতেও একই কাজ করা যেতে পারে।
এই স্ট্রিংটি কোনও পোষ্ট প্যারামিটার হিসাবে নিরাপদে পাস করা যেতে পারে।
সার্ভার সাইডে (পিএইচপি), আমি সমস্ত "এইচ" কে "\" এ পরিবর্তন করি এবং আমি ফলাফলটি স্ট্রিংটি json_decode এ পাস করি। চূড়ান্ত পদক্ষেপটি মাইএসকিউএলে স্ট্রিংটি সঞ্চয় করার আগে একক উদ্ধৃতি থেকে বাঁচা।
এইভাবে আমি আমার সার্ভারে যে কোনও ইউটিএফ 8 স্ট্রিং সঞ্চয় করতে পারি।
এই আমার জন্য কাজ করছে।
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/
আপনি দ্রুত এক্সটেনশন সহ এই ফাংশনটিও ব্যবহার করতে পারেন। কোনও সমস্যা থাকলে দয়া করে আমাকে জানান let