Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

概要

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を絶賛進行中です。セーニャかわいい。

wadaaaan
iOS開発をしたりPythonで面白そうなことをしています。アプリ開発のための備忘録のようなものです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away