ある検索フォームを実装したところ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);
});
}
結果、対応不要でよかったが調べといてよかった