質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.10%

Swift 3.0 において、PHPのurl encodeと同じエンコーディングをしたい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 3,882

score 85

こんにちは!
Swift3.0になって、これまで使っていたエンコーディングができなくなりました。
Swift3.0では

str.addingPercentEncoding(withAllowedCharacters:NSCharacterSet.xxx)

なメソッドを使わないといけなくなったのですが、
xxxに何を指定したらいいか、わかりません。
withAllowedCharacters:もあっているかわかりません。

PHPのurl encode関数と同じエンコーディングをしたいです。
アルファベットと数字とピリオド以外の特殊文字と日本語だけを%xxxxxに
したいです。

どうコードを書けばいいでしょうか?
困っています。
助けてください。よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

let encodedString = CFURLCreateStringByAddingPercentEscapes(
            nil,
            originalString as CFString!,
            nil,
            "!*'();:@&=+$,/?%#[]" as CFString!,
            CFStringBuiltInEncodings.UTF8.rawValue


が手取り早かったです。Swift3.0でも残っていて良かったー。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

以下のサイトに載っていることで解決できると思います。

swift 3.0 のメモ

if let u: String = "http://www.test.com/あいうえお".addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed) {
    print(u)
    //=> http://www.test.com/%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A
}

定義に飛ぶと以下のように使いえるものも分かると思います。

public struct CharacterSet : ReferenceConvertible, Equatable, Hashable, SetAlgebra {

    public init()
    public init(charactersIn range: Range<UnicodeScalar>)
    public init(charactersIn range: ClosedRange<UnicodeScalar>)
    public init(charactersIn string: String)
    public init(bitmapRepresentation data: Data)
    public init?(contentsOfFile file: String)

    public var hashValue: Int { get }
    public var description: String { get }

    /// A textual representation of this instance, suitable for debugging.
    public var debugDescription: String { get }

    /// Returns a character set containing the characters in Unicode General Category Cc and Cf.
    public static var controlCharacters: CharacterSet { get }

    /// Returns a character set containing the characters in Unicode General Category Zs and `CHARACTER TABULATION (U+0009)`.
    public static var whitespaces: CharacterSet { get }

    /// Returns a character set containing characters in Unicode General Category Z*, `U+000A ~ U+000D`, and `U+0085`.
    public static var whitespacesAndNewlines: CharacterSet { get }

    /// Returns a character set containing the characters in the category of Decimal Numbers.
    public static var decimalDigits: CharacterSet { get }

    /// Returns a character set containing the characters in Unicode General Category L* & M*.
    public static var letters: CharacterSet { get }

    /// Returns a character set containing the characters in Unicode General Category Ll.
    public static var lowercaseLetters: CharacterSet { get }

    /// Returns a character set containing the characters in Unicode General Category Lu and Lt.
    public static var uppercaseLetters: CharacterSet { get }

    /// Returns a character set containing the characters in Unicode General Category M*.
    public static var nonBaseCharacters: CharacterSet { get }

    /// Returns a character set containing the characters in Unicode General Categories L*, M*, and N*.
    public static var alphanumerics: CharacterSet { get }

    /// Returns a character set containing individual Unicode characters that can also be represented as composed character sequences (such as for letters with accents), by the definition of "standard decomposition" in version 3.2 of the Unicode character encoding standard.
    public static var decomposables: CharacterSet { get }

    /// Returns a character set containing values in the category of Non-Characters or that have not yet been defined in version 3.2 of the Unicode standard.
    public static var illegalCharacters: CharacterSet { get }

    /// Returns a character set containing the characters in Unicode General Category P*.
    public static var punctuationCharacters: CharacterSet { get }

    /// Returns a character set containing the characters in Unicode General Category Lt.
    public static var capitalizedLetters: CharacterSet { get }

    /// Returns a character set containing the characters in Unicode General Category S*.
    public static var symbols: CharacterSet { get }

    /// Returns a character set containing the newline characters (`U+000A ~ U+000D`, `U+0085`, `U+2028`, and `U+2029`).
    public static var newlines: CharacterSet { get }

    /// Returns the character set for characters allowed in a user URL subcomponent.
    public static var urlUserAllowed: CharacterSet { get }

    /// Returns the character set for characters allowed in a password URL subcomponent.
    public static var urlPasswordAllowed: CharacterSet { get }

    /// Returns the character set for characters allowed in a host URL subcomponent.
    public static var urlHostAllowed: CharacterSet { get }

    /// Returns the character set for characters allowed in a path URL component.
    public static var urlPathAllowed: CharacterSet { get }

    /// Returns the character set for characters allowed in a query URL component.
    public static var urlQueryAllowed: CharacterSet { get }

    /// Returns the character set for characters allowed in a fragment URL component.
    public static var urlFragmentAllowed: CharacterSet { get }

    /// Returns a representation of the `CharacterSet` in binary format.
    public var bitmapRepresentation: Data { get }

    /// Returns an inverted copy of the receiver.
    public var inverted: CharacterSet { get }

    /// Returns true if the `CharacterSet` has a member in the specified plane.
    ///
    /// This method makes it easier to find the plane containing the members of the current character set. The Basic Multilingual Plane (BMP) is plane 0.
    public func hasMember(inPlane plane: UInt8) -> Bool

    /// Insert a range of integer values in the `CharacterSet`.
    ///
    /// It is the caller's responsibility to ensure that the values represent valid `UnicodeScalar` values, if that is what is desired.
    public mutating func insert(charactersIn range: Range<UnicodeScalar>)

    /// Insert a closed range of integer values in the `CharacterSet`.
    ///
    /// It is the caller's responsibility to ensure that the values represent valid `UnicodeScalar` values, if that is what is desired.
    public mutating func insert(charactersIn range: ClosedRange<UnicodeScalar>)

    /// Remove a range of integer values from the `CharacterSet`.
    public mutating func remove(charactersIn range: Range<UnicodeScalar>)

    /// Remove a closed range of integer values from the `CharacterSet`.
    public mutating func remove(charactersIn range: ClosedRange<UnicodeScalar>)

    /// Insert the values from the specified string into the `CharacterSet`.
    public mutating func insert(charactersIn string: String)

    /// Remove the values from the specified string from the `CharacterSet`.
    public mutating func remove(charactersIn string: String)

    /// Invert the contents of the `CharacterSet`.
    public mutating func invert()

    /// Insert a `UnicodeScalar` representation of a character into the `CharacterSet`.
    ///
    /// `UnicodeScalar` values are available on `Swift.String.UnicodeScalarView`.
    public mutating func insert(_ character: UnicodeScalar) -> (inserted: Bool, memberAfterInsert: UnicodeScalar)

    /// Insert a `UnicodeScalar` representation of a character into the `CharacterSet`.
    ///
    /// `UnicodeScalar` values are available on `Swift.String.UnicodeScalarView`.
    public mutating func update(with character: UnicodeScalar) -> UnicodeScalar?

    /// Remove a `UnicodeScalar` representation of a character from the `CharacterSet`.
    ///
    /// `UnicodeScalar` values are available on `Swift.String.UnicodeScalarView`.
    public mutating func remove(_ character: UnicodeScalar) -> UnicodeScalar?

    /// Test for membership of a particular `UnicodeScalar` in the `CharacterSet`.
    public func contains(_ member: UnicodeScalar) -> Bool

    /// Returns a union of the `CharacterSet` with another `CharacterSet`.
    public func union(_ other: CharacterSet) -> CharacterSet

    /// Sets the value to a union of the `CharacterSet` with another `CharacterSet`.
    public mutating func formUnion(_ other: CharacterSet)

    /// Returns an intersection of the `CharacterSet` with another `CharacterSet`.
    public func intersection(_ other: CharacterSet) -> CharacterSet

    /// Sets the value to the intersection of the `CharacterSet` with another `CharacterSet`.
    public mutating func formIntersection(_ other: CharacterSet)

    /// Returns the exclusive or of the `CharacterSet` with another `CharacterSet`.
    public func symmetricDifference(_ other: CharacterSet) -> CharacterSet

    /// Sets the value to the exclusive or of the `CharacterSet` with another `CharacterSet`.
    public mutating func formSymmetricDifference(_ other: CharacterSet)

    /// Returns true if `self` is a superset of `other`.
    public func isSuperset(of other: CharacterSet) -> Bool

    /// Returns true if the two `CharacterSet`s are equal.
    public static func ==(lhs: CharacterSet, rhs: CharacterSet) -> Bool
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/23 13:25

    HTTP通信で、"?A=a&B=b"みたいな文字列で渡したくて、aやbに/や&などが入っていると
    まずいのです。
    PHPのurlencode関数の場合には、:や/や&や=なども%に変換されます。

    引数を一つ一つあたっていきますね。

    キャンセル

  • 2016/09/23 13:25

    感謝の言葉を書いていませんでした。ありがとうございますー。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る