雑食日誌

Vue.jsとServerless。ときどきチーム開発

JavaScriptでURLエンコード

URLクエリ内に別URLをもたせたい時にURLをエンコードする方法についてまとめます。 今回はJavaScriptで実装しました。

encodeURI

はじめ、JavaScriptのencodeURIを試してみました。 本ブログのURLを引数に実行してみます。

> encodeURI('https://keinumata.hatenablog.com/')
'https://keinumata.hatenablog.com/'

結果は引数と何も変わらないです。これはencodeURI関数がURLを構成する予約語(;,/?:@&=+$)およびエンコードせず使用できる非予約語(-_.!~*'())はエンコードしないためです。 試しに空白を入れて実行してみます。

> encodeURI('https://keinumata.hatenablog.com/? a')
'https://keinumata.hatenablog.com/?%20a'

日本語もエンコードされます。

> encodeURI('https://keinumata.hatenablog.com/ジャヴァスクリプト')
'https://keinumata.hatenablog.com/%E3%82%B8%E3%83%A3%E3%83%B4%E3%82%A1%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88'

今回はURLのクエリに使用するため、予約語エンコードしたいので他の関数を探してみます。

encodeURIComponent

encodeURIComponentはencodeURIと比較してURLを構成する予約語(;,/?:@&=+$)もエンコードします。エンコードせず使用できる非予約語(-_.!~*'())はエンコードしません。 試しにencodeURIで試したURLを実行してみます。

> encodeURIComponent('https://keinumata.hatenablog.com/')
'https%3A%2F%2Fkeinumata.hatenablog.com%2F'

スラッシュやコロンもエンコードできました。

結論

  • URLクエリにURLを使用する場合はencodeURI ではなく encodeURIComponent を使う

参考

developer.mozilla.org