আইওএস 9-এ স্ট্রিংবাইএডিংপেসেন্টসস্ক্যাপগুলি ইউজিং এনকোডিংয়ের জন্য প্রতিস্থাপন?


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

অবমূল্যায়নের বার্তাটি বলেছে (জোর দেওয়া আমার):

পরিবর্তে স্ট্রিংবাইএডিংপিয়েন্টসইনকোডিং উইথঅ্যালয়েডচ্যার্যাক্টর (_ :) ব্যবহার করুন, যা সর্বদা প্রস্তাবিত ইউটিএফ -8 এনকোডিং ব্যবহার করে এবং যে কোনও ইউআরএল উপাদান বা সাবকমম্পোনেন্টের জন্য এনকোড থাকে তাই প্রতিটি ইউআরএল উপাদান বা সাব-কম্পোনেন্টে অক্ষরগুলি বৈধ হওয়ার জন্য বিভিন্ন বিধি রয়েছে।

সুতরাং আপনার কেবল NSCharacterSetযুক্তি হিসাবে পর্যাপ্ত সরবরাহ করতে হবে । ভাগ্যক্রমে, ইউআরএলগুলির জন্য খুব সহজে একটি শ্রেণিবদ্ধ পদ্ধতি বলা হয় URLHostAllowedCharacterSetযা আপনি এটির মতো ব্যবহার করতে পারেন:

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

সুইফট 3 এর জন্য আপডেট - পদ্ধতিটি স্থির সম্পত্তি হয়ে যায় urlHostAllowed:

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

সচেতন থাকুন, যদিও:

এই পদ্ধতিটি কোনও ইউআরএল উপাদান বা উপ-কম্পোনেন্ট স্ট্রিংকে শতাংশ-এনকোড করার উদ্দেশ্যে তৈরি করা হয়েছে, পুরো URL স্ট্রিং নয়।


6
এছাড়াও, আমি দৃ strongly়ভাবে ব্যবহার করার পরামর্শ দেব NSURLComponents, যা আপনার পক্ষে শতাংশ-এনকোডিং পরিচালনা করতে পারে।
আন্তোনিও ফাভাটা

1
পুরো ইউআরএল স্ট্রিংয়ের জন্য কী ব্যবহার করার জন্য কোনও পরামর্শ?
দক্ষতা এম 2

1
@ দক্ষতা এম 2 আমি মনে করি NSURLComponents(প্রতিটি অংশের সাথে সংশ্লিষ্টগুলির সাথে শতাংশ- এনকোডযুক্ত NSCharacterSet) হ'ল সঠিক উপায়।
আন্তোনিও ফাভাটা

2
আপনার কখনও কখনও, পুরো ইউআরএল স্ট্রিংটিকে এনকোড করার চেষ্টা করা উচিত নয়। এটি অপ্রত্যাশিত বাগ এবং কিছু ক্ষেত্রে সুরক্ষা গর্ত সৃষ্টি করতে পারে। URL টি এনকোড করার একমাত্র গ্যারান্টিযুক্ত সঠিক উপায় হ'ল এটি একবারে এক টুকরো করে।
ডিগাটউড

গ্রেট। অনেক ধন্যবাদ, সাথী!
ফিলিপ

100

উদ্দেশ্য-সি For

NSString *str = ...; // some URL
NSCharacterSet *set = [NSCharacterSet URLHostAllowedCharacterSet]; 
NSString *result = [str stringByAddingPercentEncodingWithAllowedCharacters:set];

এনএসইউটিএফ 8 স্ট্রিংএইনকোডিংয়ের জন্য সেটটি কোথায় পাবেন?

ছয়টি ইউআরএল উপাদান এবং উপ-উপাদানগুলির জন্য পূর্বনির্ধারিত অক্ষর সেট রয়েছে যা শতাংশ এনকোডিংয়ের অনুমতি দেয়। এই চরিত্র সেটগুলিতে প্রেরণ করা হয় -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

অবমূল্যায়নের বার্তাটি বলেছে (জোর দেওয়া আমার):

পরিবর্তে স্ট্রিংবাইএডিংপিয়েন্টসইনকোডিং উইথঅ্যালয়েডচ্যার্যাক্টর (_ :) ব্যবহার করুন, যা সর্বদা প্রস্তাবিত ইউটিএফ -8 এনকোডিং ব্যবহার করে এবং যে কোনও ইউআরএল উপাদান বা সাবকমম্পোনেন্টের জন্য এনকোড থাকে তাই প্রতিটি ইউআরএল উপাদান বা সাব-কম্পোনেন্টে অক্ষরগুলি বৈধ হওয়ার জন্য বিভিন্ন বিধি রয়েছে।

সুতরাং আপনার কেবল NSCharacterSetযুক্তি হিসাবে পর্যাপ্ত সরবরাহ করতে হবে । ভাগ্যক্রমে, ইউআরএলগুলির জন্য খুব সহজে একটি শ্রেণিবদ্ধ পদ্ধতি বলা হয় URLHostAllowedCharacterSetযা আপনি এটির মতো ব্যবহার করতে পারেন:

NSCharacterSet *set = [NSCharacterSet URLHostAllowedCharacterSet]; 

সচেতন থাকুন, যদিও:

এই পদ্ধতিটি কোনও ইউআরএল উপাদান বা উপ-কম্পোনেন্ট স্ট্রিংকে শতাংশ-এনকোড করার উদ্দেশ্যে তৈরি করা হয়েছে, পুরো URL স্ট্রিং নয়।


4
আমি ভালবাসি যখন অ্যাপল জীবনকে সহজ করে তোলে। ধন্যবাদ আপেল
হাঁস

5
"এই পদ্ধতিটি কোনও ইউআরএল উপাদান বা উপ-কম্পোনেন্ট স্ট্রিংকে পুরো-এনকোড করার উদ্দেশ্যে তৈরি করা হয়, পুরো ইউআরএল স্ট্রিং নয়" " ?
জেনকোড

4
URLHostAllowedCharacterSet "অসমর্থিত ইউআরএল" ত্রুটি দিচ্ছিল, আমি ইউআরএলফ্র্যাগমেন্টএলয়েডচ্যারাকটারসেট এবং এটির কাজ ঠিকঠাক ব্যবহার করেছি।
anoop4real

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      "#%/:<>?@[\]^`


মূল্যবান যে এই সেটগুলির মধ্যে কোনওটিই অন্তর্ভুক্ত নয় +। সুতরাং ক্যোয়ারী প্যারামিটারগুলিতে পাস করা হলে - স্ট্রিংয়ের লক্ষণগুলি গণ্ডগোল হবে - সার্ভারের পাশে স্থান space as হিসাবে বিবেচিত হবে।
আসমো সোনিও

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 এর জন্য

আপনি urlHostAllowedক্যারেক্টারসেট ব্যবহার করতে পারেন ।

/// একটি হোস্ট ইউআরএল উপ-অংশে অনুমোদিত অক্ষরগুলির জন্য অক্ষর সেটটি ফিরিয়ে দেয়।

public static var urlHostAllowed: CharacterSet { get }

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

1

"এই পদ্ধতিটি কোনও ইউআরএল উপাদান বা উপ-কম্পোনেন্ট স্ট্রিংকে পুরো-এনকোড করার উদ্দেশ্যে তৈরি করা হয়, পুরো ইউআরএল স্ট্রিং নয়" " ? - জেনকোড 1 সেপ্টেম্বর '16 8:30 এ

এর অর্থ হ'ল https://xpto.example.com/path/subpathআপনার ইউআরএলটি এনকোড করার কথা নয় , তবে কেবলমাত্র যা পরে চলে ?

ধারণা করা হয়েছে, কারণ এটির ক্ষেত্রে ব্যবহারের ক্ষেত্রে যেমন রয়েছে:

https://example.com?redirectme=xxxxx

যেখানে xxxxxসম্পূর্ণ এনকোডেড URL রয়েছে।


0

গৃহীত উত্তরে যুক্ত করা হচ্ছে। এই নোট বিবেচনা করা

এই পদ্ধতিটি কোনও ইউআরএল উপাদান বা উপ-কম্পোনেন্ট স্ট্রিংকে শতাংশ-এনকোড করার উদ্দেশ্যে তৈরি করা হয়েছে, পুরো 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!
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.