Golangでパーセントエンコーディング

Goには標準のurlパッケージにQueryEscape()関数が用意されているので、これを利用してパーセントエンコーディングができます。 しかし、単純にQueryEscape()を使うと、以下のように半角スペースが+と表示されてしまいます。

package main

import (
    "fmt"
    "net/url"
)

func main() {
    str := "パーセント エンコーディング"

    str = url.QueryEscape(str)

    fmt.Println(str)
    // %E3%83%91%E3%83%BC%E3%82%BB%E3%83%B3%E3%83%88+%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0

}

ASCIIコード表を見ると半角スペースには0x20が割り当てられているので、これを置換してあげればOKです。

package main

import (
    "fmt"
    "net/url"
    "regexp"
)

func main() {
    str := "パーセント エンコーディング"

    str = url.QueryEscape(str)
    str = regexp.MustCompile(`([^%])(\+)`).ReplaceAllString(str, "$1%20")

    fmt.Println(str)
    // %E3%83%91%E3%83%BC%E3%82%BB%E3%83%B3%E3%83%88%20%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0

}

References