Edited at

【Swift】日本語を含んだ文字列をURLやNSURLにするとnilになる


概要

URL(string: String)NSURL(string: String)を利用してStringをURLやNSURLにしようとする時に、

let urlString: String = "https://google.com/search?q=ドラゴンクエスト"

let url = URL(string: urlString) //nil

こんな感じで URLにする文字列自体に日本語が含まれているnilが返ってきてしまいます。


解決策

文字列にパーセントエンコーディングをかけることで無事に変換できるようになります。

let urlString: String = "https://google.com/search?q=ドラゴンクエスト"

let encodeUrlString: String = urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
let url = URL(string: encodeUrlString)
//https://google.com/search?q=%E3%83%89%E3%83%A9%E3%82%B4%E3%83%B3%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88

ちなみにデコードは.removingPercentEncodingで可能です。

let urlString: String = "https://google.com/search?q=%E3%83%89%E3%83%A9%E3%82%B4%E3%83%B3%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88"

let decodeUrlString: String = urlString.removingPercentEncoding
//https://google.com/search?q=ドラゴンクエスト


余談 : パーセントエンコーディングとは

パーセントエンコーディングとは、ざっくり説明すると URLで使えない文字をパーセント(%)と英数字の組み合わせで表現すること です。

例えばひらがなの「あ」は「%E3%81%82」、「い」は「%E3%81%84」のように表現されます。

普段我々が日本語のキーワードで検索をしている時も、URLにはパーセントエンコーディングが使われています。


おわりに

いまドラクエ11を絶賛進行中です。セーニャかわいい。