📱
パーセントエンコーディング【Swift】
対象となるひと
Swiftでパーセントエンコーディングしようとしたら、stringByAddingPercentEscapesUsingEncodingがdeprecatedになって困っている人向け。
%エンコーディングって?
URLなどで、予約文字が入ってしまうと困る場合にエスケープする処理。
例えば、GETパラメータに"/"入ると困るとかの場合、%2Fという形に変換する。
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
RFC 3986
Discussion