記号文字の URL エンコード - Java, .NET, JavaScript, Ruby, Python, PHP
下記のような文字をいくつかのプログラム言語の標準的な API で URL (URI) エンコードしてみたらどうなるか試してみました。
; / ? : @ = & % $ - _ . + ! * ' " ( ) , { } | \ ^ ~ [ ]
使用した言語は下記の通りです。
- Groovy (Java API)
- C# (.NET Framework)
- JavaScript
- Ruby
- Python
- PHP
ソースは http://github.com/fits/try_samples/tree/master/blog/20130425/
Java の場合
Java では下記メソッドが使えます。
- java.net.URLEncoder の encode() メソッド
今回は Groovy で実装してみました。
url_encode.groovy
str = ';/?:@=&% $-_.+!*\'"(),{}|\\^~[]' println URLEncoder.encode(str)
実行結果
> groovy url_encode.groovy %3B%2F%3F%3A%40%3D%26%25+%24-_.%2B%21*%27%22%28%29%2C%7B%7D%7C%5C%5E%7E%5B%5D
- 半角スペースが + になる
- - _ . * はエンコードされない
.NET の場合
.NET では下記メソッドが使えます。
- System.Uri の EscapeUriString() メソッド
- System.Web.HttpUtility の UrlEncode() メソッド
今回は C# で実装してみました。
url_encode.cs
using System; using System.Web; class UrlEncode { static void Main(string[] args) { var str = ";/?:@=&% $-_.+!*'\"(),{}|\\^~[]"; // (1) Console.WriteLine(Uri.EscapeUriString(str)); // (2) Console.WriteLine(HttpUtility.UrlEncode(str)); } }
実行結果
> csc url_encode.cs ・・・ > url_encode.exe ;/?:@=&%25%20$-_.+!*'%22(),%7B%7D%7C%5C%5E~%5B%5D %3b%2f%3f%3a%40%3d%26%25+%24-_.%2b!*%27%22()%2c%7b%7d%7c%5c%5e%7e%5b%5d
JavaScript の場合
JavaScript では下記 API が使えます。
- escape()
- encodeURI()
- encodeURIComponent()
node.js で実行してみました。
url_encode.js
var str = ';/?:@=&% $-_.+!*\'"(),{}|\\^~[]'; // (1) console.log(escape(str)); // (2) console.log(encodeURI(str)); // (3) console.log(encodeURIComponent(str));
実行結果
> node url_encode.js %3B/%3F%3A@%3D%26%25%20%24-_.+%21*%27%22%28%29%2C%7B%7D%7C%5C%5E%7E%5B%5D ;/?:@=&%25%20$-_.+!*'%22(),%7B%7D%7C%5C%5E~%5B%5D %3B%2F%3F%3A%40%3D%26%25%20%24-_.%2B!*'%22()%2C%7B%7D%7C%5C%5E~%5B%5D
Ruby の場合
- URI.escape(), encode()
- CGI.escape()
url_encode.rb
require 'uri' require 'cgi' str = ';/?:@=&% $-_.+!*\'"(),{}|\\^~[]' # (1) puts URI.escape(str) puts URI.encode(str) # (2) puts CGI.escape(str)
実行結果
> ruby url_encode.rb ;/?:@=&%25%20$-_.+!*'%22(),%7B%7D%7C%5C%5E~[] ;/?:@=&%25%20$-_.+!*'%22(),%7B%7D%7C%5C%5E~[] %3B%2F%3F%3A%40%3D%26%25+%24-_.%2B%21%2A%27%22%28%29%2C%7B%7D%7C%5C%5E%7E%5B%5D
Python の場合
- urllib.quote()
url_encode.py
import urllib str = ';/?:@=&% $-_.+!*\'"(),{}|\\^~[]' print urllib.quote(str)
実行結果
> python url_encode.py %3B/%3F%3A%40%3D%26%25%20%24-_.%2B%21%2A%27%22%28%29%2C%7B%7D%7C%5C%5E%7E%5B%5D
- 半角スペースが %20 になる
- / - _ . がエンコードされない
PHP の場合
- urlencode()
- rawurlencode()
url_encode.php
<?php $str = ';/?:@=&% $-_.+!*\'"(),{}|\\^~[]'; // (1) echo urlencode($str), "\n"; // (2) echo rawurlencode($str); ?>
まとめ
まとめると以下のようになりました。
こうしてみると微妙な違いが結構ありますね。
言語環境 | API | 半角スペースのエンコード | エンコードされない文字 |
---|---|---|---|
Java | URLEncoder.encode() | + | - _ . * |
.NET | Uri.EscapeUriString() | %20 | ; / ? : @ = & $ - _ . + ! * ' ( ) , ~ |
.NET | HttpUtility.UrlEncode() | + | - _ . ! * ( ) |
JavaScript | escape() | %20 | / @ - _ . + * |
JavaScript | encodeURI() | %20 | ; / ? : @ = & $ - _ . + ! * ' ( ) , ~ |
JavaScript | encodeURIComponent() | %20 | - _ . ! * ' ( ) ~ |
Ruby | URI.escape(), encode() | %20 | ; / ? : @ = & $ - _ . + ! * ' ( ) , ~ [ ] |
Ruby | CGI.escape() | + | - _ . |
Python | urllib.quote() | %20 | / - _ . |
PHP | urlencode() | + | - _ . |
PHP | rawurlencode() | %20 | - _ . ~ |