JavaScriptに限った話ではありませんが、先日TwitterAPIをいじっていて、そこでつまづいたことがあったのでメモ。

JavaScriptでGETメソッドで非同期通信するのにクエリをURLエンコードする時、escape()やencodeURI()、encodeURIComponent()を使いますよね。
環境によってはそれだけでは不十分とのこと。

エンコードできない文字の存在

これらの関数ではエンコードできない記号がある。

escape()でエンコードできない記号

/ @ – _ . + *

encodeURI()でエンコードできない記号

; / ? : @ = & $ – _ . + ! * ‘ ( ) , ~

encodeURIComponent()でエンコードできない記号

– _ . ! * ‘ ( ) ~

参考: 記号文字の URL エンコード – Java, .NET, JavaScript, Ruby, Python, PHP

これらの文字の存在により、RESTful APIなど一部の環境で通信する時にエラーが発生したり予期しない動作をすることがある。
URLエンコードにも様々な仕様があるため、それを調べて適切にエンコードしないといけないようです。