URI エンコーディングについて
今回は軽く小ネタで。
「パーセント・エンコーディング(percent-encoding)」というのがある。
これは文字符号を “%xx
” 形式でオクテット単位の16進数コードに展開して記述することを指して言うらしい。
たとえば「こんにちは」は UTF-8 で「%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF
」と表記する。
パーセント・エンコーディングは Web などの URI 表記で使われる。
詳しいことは RFC 3986 辺りを参照してもらうとして, Go 言語ではこれを標準の net/
url
パッケージで提供している。
ただし以下の2種類ある。
どう違うかは実際にコードを組んでみたほうが早いだろう。
まずは url
.QueryEscape()
/ url
.QueryUnescape()
のほうから
package main
import (
"fmt"
"net/url"
"os"
)
func main() {
str0 := "こんにちは 世界"
str1 := url.QueryEscape(str0)
fmt.Println(str1)
// %E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF+%E4%B8%96%E7%95%8C
str2, err := url.QueryUnescape(str1)
if err != nil {
fmt.Fprintln(os.Stderr, err)
return
}
fmt.Println(str2)
// こんにちは 世界
}
次に url
.PathEscape()
/ url
.PathUnescape()
のほう
package main
import (
"fmt"
"net/url"
"os"
)
func main() {
str0 := "こんにちは 世界"
str1 := url.PathEscape(str0)
fmt.Println(str1)
// %E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%20%E4%B8%96%E7%95%8C
str2, err := url.PathUnescape(str1)
if err != nil {
fmt.Fprintln(os.Stderr, err)
return
}
fmt.Println(str2)
// こんにちは 世界
}
パッと見で分かりやすいのは空白文字の扱いだろう。 両者の違いは関数の名前の通り URI の query 部分(part)で使うか path 部分で使うかの違いである。
ちなみに URI を
foo://example.com:8042/over/there?name=ferret#nose
とするなら,構成要素(component)は
部分名 | 部分 |
---|---|
scheme | foo |
authority | example.com:8042 |
path | /over/there |
query | name=ferret |
fragment | nose |
という感じに分類される。 上手く使い分けよう。
ブックマーク
- Golangでパーセントエンコーディング - 逆さまにした
- encodeURIComponentが世界基準だと誤解してた話 - Qiita
- URLエンコードについておさらいしてみた - Qiita
- Big Sky :: Golang で物理ファイルの操作に path/filepath でなく path を使うと爆発します。 : URL の操作には
http.ServeFile
を使うとかあるらしい
参考図書
- 改訂2版 みんなのGo言語
- 松木 雅幸 (著), mattn (著), 藤原 俊一郎 (著), 中島 大一 (著), 上田 拓也 (著), 牧 大輔 (著), 鈴木 健太 (著)
- 技術評論社 2019-08-01 (Release 2019-08-01)
- Kindle版
- B07VPSXF6N (ASIN)
- 評価
改訂2版の目玉は7章の「データベースの扱い方」が追加されたことだろう。他の章では,大まかな構成は1版と同じだが細かい部分が変わっていて Go 1.12 への言及まであるのには驚いた。
- Go言語によるWebアプリケーション開発
- Mat Ryer (著), 鵜飼 文敏 (監修), 牧野 聡 (翻訳)
- オライリージャパン 2016-01-22
- 大型本
- 4873117526 (ASIN), 9784873117522 (EAN), 4873117526 (ISBN)
- 評価
日本語監訳者による解説(付録 B)が意外に役に立つ感じ。 Web アプリケーションだけでなく,サーバサイドで動く CLI アプリへの言及もある。良書だが今となってはちょっと内容が古い。
-
url
.PathEscape()
/url
.PathUnescape()
は Go 1.8 から追加された。 ↩︎