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
みんなのGo言語【現場で使える実践テクニック】
松木雅幸 mattn 藤原俊一郎 中島大一 牧 大輔 鈴木健太 稲葉貴洋
技術評論社 2016-09-09
評価

WEB+DB PRESS Vol.95 プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES) プログラミングElixir Go言語によるWebアプリケーション開発 詳解MySQL 5.7 止まらぬ進化に乗り遅れないためのテクニカルガイド (NEXT ONE) WEB+DB PRESS Vol.94 Docker スターティングGo言語 (CodeZine BOOKS) オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方 WebデベロッパーのためのReact開発入門 JavaScript UIライブラリの基本と活用

リファレンス本なのに索引が貧弱。これなら Kindle で買ってもよかったか。 1.7 への言及があるのはよかった。

reviewed by Spiegel on 2016-11-17 (powered by G-Tools)

photo
Go言語によるWebアプリケーション開発
Mat Ryer 鵜飼 文敏
オライリージャパン 2016-01-22
評価

プログラミング言語Go マイクロサービスアーキテクチャ nginx実践入門 (WEB+DB PRESS plus) 改訂2版 基礎からわかる Go言語 サーバ/インフラエンジニア養成読本 DevOps編 [Infrastructure as Code を実践するノウハウが満載! ] (Software Design plus)

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

reviewed by Spiegel on 2016-03-13 (powered by G-Tools)


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