読者です 読者をやめる 読者になる 読者になる

記号文字の URL エンコード - Java, .NET, JavaScript, Ruby, Python, PHP

下記のような文字をいくつかのプログラム言語の標準的な API で URL (URIエンコードしてみたらどうなるか試してみました。

; / ? : @ = & % $ - _ . + ! * ' " ( ) , { } | \ ^ ~ [ ]

使用した言語は下記の通りです。

ソースは 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
  • (1) Uri.EscapeUriString()
    • 半角スペースが %20 になる
    • ; / ? : @ = & $ - _ . + ! * ' ( ) , ~ はエンコードされない
  • (2) HttpUtility.UrlEncode()
    • 半角スペースが + になる
    • - _ . ! * ( ) はエンコードされない
    • アルファベットが小文字

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
  • (1) escape()
    • 半角スペースが %20 になる
    • / @ - _ . + * がエンコードされない
  • (2) encodeURI()
    • 半角スペースが %20 になる
    • ; / ? : @ = & $ - _ . + ! * ' ( ) , ~ がエンコードされない
  • (3) encodeURIComponent()
    • 半角スペースが %20 になる
    • - _ . ! * ' ( ) ~ がエンコードされない

Ruby の場合

Ruby では下記 API が使えます。

  • 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
  • (1) URI.escape(), encode()
    • 半角スペースが %20 になる
    • ; / ? : @ = & $ - _ . + ! * ' ( ) , ~ [ ] がエンコードされない
  • (2) CGI.escape()

Python の場合

Python では下記 API が使えます。

  • 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 の場合

PHP では下記 API が使えます。

  • urlencode()
  • rawurlencode()
url_encode.php
<?php
$str = ';/?:@=&% $-_.+!*\'"(),{}|\\^~[]';

// (1)
echo urlencode($str), "\n";
// (2)
echo rawurlencode($str);
?>
実行結果
> php url_encode.php
%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
%3B%2F%3F%3A%40%3D%26%25%20%24-_.%2B%21%2A%27%22%28%29%2C%7B%7D%7C%5C%5E~%5B%5D
  • (1) urlencode()
  • (2) rawurlencode()
    • 半角スペースが %20 になる
    • - _ . ~ がエンコードされない

まとめ

まとめると以下のようになりました。
こうしてみると微妙な違いが結構ありますね。

言語環境 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 - _ . ~