web-dev-qa-db-ja.com

カスタムNSCharacterSetを作成する方法

CharacterSet.urlQueryAllowedは、パーセントエンコーディングを文字列に追加します。

一部の文字が期待どおりにエンコードされていません(つまり、&および?は変更されません)。そうは言っても、理想的には既存のものに基づいてカスタムCharacterSetを作成するというアイデアがありました。

そのための最善の方法は何ですか?

18
ixany

新しい文字セットを作成する最も一般的な方法は、CharacterSet(charactersIn:)を使用して、セットのすべての文字をStringに指定することです。

既存のセットにいくつかの文字を追加するには、以下を使用します。

let characterSet = NSMutableCharacterSet() //create an empty mutable set
characterSet.formUnionWithCharacterSet(NSCharacterSet.URLQueryAllowedCharacterSet())
characterSet.addCharactersInString("?&")

またはSwift 3 +で単純に:

var characterSet = CharacterSet.urlQueryAllowed
characterSet.insert(charactersIn: "?&")

URLエンコーディングについては、 Objective-CおよびSwift URLエンコーディング にも注意してください。

40
Sulthan

あなたは私の方法を試すことができます:

let password = "?+=!@#$%^&*()-_abcdABCD1234`~"

// Swift 2.3
extension NSCharacterSet {
    static var rfc3986Unreserved: NSCharacterSet {
        let mutable = NSMutableCharacterSet()
        mutable.formUnionWithCharacterSet(.alphanumericCharacterSet())
        mutable.addCharactersInString("-_.~")
        return mutable
    }
}

let encoding = password.stringByAddingPercentEncodingWithAllowedCharacters(.rfc3986Unreserved)

// Swift 3
extension CharacterSet {
    static var rfc3986Unreserved: CharacterSet {
        return CharacterSet(charactersIn: "-_.~").union(.alphanumerics)
    }
}

let encoding = password.addingPercentEncoding(withAllowedCharacters: .rfc3986Unreserved)

Print:
original -> ?+=!@#$%^&*()-_abcdABCD1234`~
encoding -> %3F%2B%3D%21%40%23%24%25%5E%26%2A%28%29-_abcdABCD1234%60~

rfc3986: https://tools.ietf.org/html/rfc3986reference

5
Arco