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()
  • url.PathEscape() / url.PathUnescape() 1

どう違うかは実際にコードを組んでみたほうが早いだろう。

まずは 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

という感じに分類される。 上手く使い分けよう。

ブックマーク

参考図書

photo
改訂2版 みんなのGo言語
松木 雅幸 (著), mattn (著), 藤原 俊一郎 (著), 中島 大一 (著), 上田 拓也 (著), 牧 大輔 (著), 鈴木 健太 (著)
技術評論社 2019-08-01 (Release 2019-08-01)
Kindle版
B07VPSXF6N (ASIN)
評価     

改訂2版の目玉は7章の「データベースの扱い方」が追加されたことだろう。他の章では,大まかな構成は1版と同じだが細かい部分が変わっていて Go 1.12 への言及まであるのには驚いた。

reviewed by Spiegel on 2019-08-12 (powered by PA-APIv5)

photo
Go言語によるWebアプリケーション開発
Mat Ryer (著), 鵜飼 文敏 (監修), 牧野 聡 (翻訳)
オライリージャパン 2016-01-22
大型本
4873117526 (ASIN), 9784873117522 (EAN), 4873117526 (ISBN)
評価     

日本語監訳者による解説(付録 B)が意外に役に立つ感じ。 Web アプリケーションだけでなく,サーバサイドで動く CLI アプリへの言及もある。良書だが今となってはちょっと内容が古い。

reviewed by Spiegel on 2019-08-12 (powered by PA-APIv5)


  1. url.PathEscape() / url.PathUnescape()Go 1.8 から追加された。