質問: GoのWAFであるEcho () を使ってサイトを作成しています。そこでタイトルのような挙動に出くわしました。 つまり、 `http://localhost:3000/tag/%E3%82%AA%E3%83%9E%E3%82%B1` というURLと `http://localhost:3000/tag/%e3%82%aa%e3%83%9e%e3%82%b1` というURLで得られる値が違うという結果になってしまいます。前者のURLではちゃんとデコードされますが、後者はデコードされずにエンコードされたままの文字列を取得します。なぜこのような挙動がおこるのでしょうか。 パスパラメータの取得部分のコードは以下のようになっています。 **コード例** ``` tagName := c.Param("name") fmt.Println(tagName) ``` **出力** 前者の場合 ``` オマケ ``` 後者の場合 ``` %e3%82%aa%e3%83%9e%e3%82%b1 ```
回答: ~~URL Standard に従うと、パーセントエンコーディングでは、`%` 記号の後に数字または `A` から `F` までの **大文字** アルファベットを使うと決められています。~~ 上の回答は、的を射ていません。修正します。 これは echo の挙動に原因があります。 StackDestroyer さんのご指摘どおり、これは echo 側で URL を扱う際 `URL.RawPath` を自前で処理しており、エンコードが大文字か小文字かで差異が生じてしまっています。`net/url` の godoc も合わせてご覧ください。 おそらく今回のご投稿が発端かとは思われますが、echo の issue トラッカーにこの挙動が報告されています。これが修正されるまで待つか、それぞれのエンコードに対してアドホックに対応するのが良いと思います。