📱

パーセントエンコーディング【Swift】

2021/01/25に公開

対象となるひと

Swiftでパーセントエンコーディングしようとしたら、stringByAddingPercentEscapesUsingEncodingがdeprecatedになって困っている人向け。

%エンコーディングって?

URLなどで、予約文字が入ってしまうと困る場合にエスケープする処理。
例えば、GETパラメータに"/"入ると困るとかの場合、%2Fという形に変換する。

https://ja.wikipedia.org/wiki/パーセントエンコーディング

addingPercentEncodingを使ってエンコーディング


// 対象の文字列
let query = "パーセントエンコーディング"

// 変換対象外とする文字列(英数字と-._~)
let allowedCharacters = NSCharacterSet.alphanumerics.union(.init(charactersIn: "-._~"))

// 変換処理
let URL = URL(string: query.addingPercentEncoding(withAllowedCharacters: allowedCharacters)!)!

パラメータのwithAllowedCharactersには許可するCharacterSetを設定する。NSCharacterSet.alphanumericsを設定した場合、英数字以外の記号やマルチバイト文字は全てエンコーディングしてしまいます。RFC3986準拠するために-._~をエンコーディングから除外しています。

実行結果


let sample1 = "`~!@#$%^&*()-_=+[{]}¥|;:',.<>?`"
let sample2 = "abcdefghijklmnopqrstuvwxyz1234567890"
let sample3 = "あいうえお「」?"
let allowedCharacters = NSCharacterSet.alphanumerics.union(.init(charactersIn: ".-_~"))

print(sample1.addingPercentEncoding(withAllowedCharacters: allowedCharacters)!)
// %60~%21%40%23%24%25%5E%26%2A%28%29-_%3D%2B%5B%7B%5D%7D%C2%A5%7C%3B%3A%27%2C.%3C%3E%3F%60

print(sample2.addingPercentEncoding(withAllowedCharacters: allowedCharacters)!)
// abcdefghijklmnopqrstuvwxyz1234567890

print(sample3.addingPercentEncoding(withAllowedCharacters: allowedCharacters)!)
// %E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A%E3%80%8C%E3%80%8D%EF%BC%9F

参考

ありがとうStackoverflow
https://stackoverflow.com/questions/28882954/
https://developer.apple.com/documentation/foundation/nscharacterset

RFC 3986
https://www.asahi-net.or.jp/~ax2s-kmtn/ref/uric.html

Discussion