यह स्विफ्ट 5 में मेरे लिए काम कर रहा है । उपयोग का मामला क्लिपबोर्ड से एक URL ले रहा है या इसी तरह जो पहले से ही बच गए वर्ण हो सकते हैं, लेकिन जिसमें यूनिकोड वर्ण भी शामिल हैं जो विफल हो सकते हैं URLComponents
या URL(string:)
विफल हो सकते हैं।
सबसे पहले, एक ऐसा कैरेक्टर सेट बनाएं जिसमें सभी URL-कानूनी वर्ण शामिल हों:
extension CharacterSet {
/// Characters valid in at least one part of a URL.
///
/// These characters are not allowed in ALL parts of a URL; each part has different requirements. This set is useful for checking for Unicode characters that need to be percent encoded before performing a validity check on individual URL components.
static var urlAllowedCharacters: CharacterSet {
// Start by including hash, which isn't in any set
var characters = CharacterSet(charactersIn: "#")
// All URL-legal characters
characters.formUnion(.urlUserAllowed)
characters.formUnion(.urlPasswordAllowed)
characters.formUnion(.urlHostAllowed)
characters.formUnion(.urlPathAllowed)
characters.formUnion(.urlQueryAllowed)
characters.formUnion(.urlFragmentAllowed)
return characters
}
}
अगला, String
URL को एन्कोड करने के लिए एक विधि के साथ विस्तार करें:
extension String {
/// Converts a string to a percent-encoded URL, including Unicode characters.
///
/// - Returns: An encoded URL if all steps succeed, otherwise nil.
func encodedUrl() -> URL? {
// Remove preexisting encoding,
guard let decodedString = self.removingPercentEncoding,
// encode any Unicode characters so URLComponents doesn't choke,
let unicodeEncodedString = decodedString.addingPercentEncoding(withAllowedCharacters: .urlAllowedCharacters),
// break into components to use proper encoding for each part,
let components = URLComponents(string: unicodeEncodedString),
// and reencode, to revert decoding while encoding missed characters.
let percentEncodedUrl = components.url else {
// Encoding failed
return nil
}
return percentEncodedUrl
}
}
जिसका परीक्षण किया जा सकता है जैसे:
let urlText = "https://www.example.com/폴더/search?q=123&foo=bar&multi=eggs+and+ham&hangul=한글&spaced=lovely%20spam&illegal=<>#top"
let url = encodedUrl(from: urlText)
url
अंत में मूल्य :https://www.example.com/%ED%8F%B4%EB%8D%94/search?q=123&foo=bar&multi=eggs+and+ham&hangul=%ED%95%9C%EA%B8%80&spaced=lovely%20spam&illegal=%3C%3E#top
ध्यान दें कि %20
और +
रिक्ति दोनों संरक्षित हैं, यूनिकोड वर्ण एन्कोडेड हैं, %20
मूल urlText
में डबल एन्कोडेड नहीं है, और एंकर (टुकड़ा, या #
) रहता है।
संपादित करें: अब प्रत्येक घटक की वैधता के लिए जाँच।