ある検索フォームを実装したところQAの人から「? 」を含むキーワードの検索がおかしいと指摘があった
すぐにURIエンコードが必要だとわかってencodeURIComponent
を使ってキーワードをエンコードしてOKが出たのだが「他の記号は大丈夫なんでしょうか?」という質問をされた
WEB標準APIを使っているので大丈夫だと返答しようとしたが、上記のMDNのドキュメントに
エスケープされないもの: A-Z a-z 0-9 - _ . ! ~ * ' ( )
という一文があり、返答する前に調べることにした
wikipediaが目に入ったのでみてみると
とあるので、! ' ( ) *
は予約語にもかかわらずエスケープされないことになる
MDNのドキュメントにあるようにURIの使用は2つあって
RFC2396(1998年発行)
RFC 2396 - Uniform Resource Identifiers (URI): Generic Syntax
RFC 3986(2005年発行)
RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax
encodeURIComponent
はRFC2396に準拠しているらしい
なので、パースするサーバー側がどちらの仕様に準拠しているかで、encodeURIComponent
のままでよいかどうかが変わる
RFC 3986にも準拠する場合は以下を実装する必要がある
function fixedEncodeURIComponent(str) { return encodeURIComponent(str).replace(/[!'()*]/g, function(c) { return '%' + c.charCodeAt(0).toString(16); }); }
結果、対応不要でよかったが調べといてよかった