- クライアント側:C#.net
- サーバ側:Node.js
上の構成にてアプリケーションを作成しており、クライアント側からURLでユーザ入力文字列を渡す必要があったので、そのときのURLエンコード、デコードのメモを残します。
やりたかった事
ユーザ入力文字列をURLからNodeに渡したい。
調査対象文字列
`~!@#$%^&*()-_=+[{]}\|;:'",<.>/ ?
アルファベットや数値はエンコードしないでしょー、日本語とかの文字列はエンコードするでしょーってことで上に挙げた文字列を対象とし、エンコードデコードの動作を調査した。
環境
- OSはサーバ、クライアントともWin7
- C#.Net 2.0
- Node.js v0.10.28
使用したメソッド
- C#
System.Web.HttpUtility.UrlEncode() - Node
decodeURI()
decodeURIComponent()
調査結果
クライアント(C#.Net)でのエンコード時
%60%7e!%40%23%24%25%5e%26*()-_%3d%2b%5b%7b%5d%7d/%7c%3b%3a%27%22%2c%3c.%3e/+%3f
!*()-_./はエンコードされない。半角空白は+として現れる。
\(円、バックスラッシュ)は/(スラッシュ)に置換されるみたい。
サーバ(Node.js)でのデコード時
decodeURI()
`~!%40%23%24%^%26*()-_%3d%2b[{]}/|%3b%3a'"%2c<.>/+%3f
いくつかの文字列を期待通りにデコードしない。
decodeURIComponent()
`~!@#$%^&*()-_=+[{]}/|;:'",<.>/+?
ほぼ期待通り。ただし、クライアントから送られてくる時点で\が/に置換されており、+が本来の意味の+と空白であった+がそのまま出現する。
最終的に…
- クライアント側でSystem.Web.HttpUtility()を使用してURLをエンコード
- サーバ側で受信したエンコード済みURL文字列をreplace('+', ' ')で+を空白に置換
- +置換済み文字列をdecodeURIComponent()でデコード
する方法を採用しました。\と/は入力を許可していないので問題なしと判断しています。