URLエンコードは、各言語(というかライブラリ)実装によって違う。
ので、言語をまたがっての、URLエンコードされた文字列の比較はムリポorどちらかがどちらかを考慮してがんばる。
以下、俺調べ。
それぞれのポリシーを探ったり、RFCじっくり読むとかは後で。
言語 | ライブラリ | 英数字以外の エンコード対象外 |
空白文字(0x20)の 扱い |
マルチバイト 文字 |
情報源 | ||
---|---|---|---|---|---|---|---|
ruby | URI.encode | -_.!~*'();/?:@&=+$,[] | %20 | デコード | ソース | ||
perl | URI::Escape | -_.!~*'() | %20 | デコード | ソース | ||
php | urlencode | -_. | + | デコード | マニュアル | ||
java | java.net.URLEncoder.encode | -_.* | + | 非処理 | javadoc |
もう何が何やらー(苦笑
マルチバイト文字という欄は、
例えば「点」(SJIS)という字は、「%93%5F」なんですが、%5Fは「_」なので、「%93_」と全体を再評価・短縮化?しちゃうことがあるのです。(便宜上、それをデコードする、といってます。)
なので、ruby/perl/phpでは「%93_」、javaでは「%93%5F」。
あひゃひゃひゃひゃー。
以下、検証用の各ソース。
% cat urlenc.rb require 'uri' p URI.encode('-_.!~*\'();/?:@&=+$,[]') % ruby urlenc.rb "-_.!~*'();/?:@&=+$,[]"
% cat urlenc.pl use URI::Escape; print uri_escape('-_.!~*\'();/?:@&=+$,[]'); % perl urlenc.pl -_.!~*'()%3B%2F%3F%3A%40%26%3D%2B%24%2C%5B%5D
% cat urlenc.php <?php echo urlencode("-_.!~*'();/?:@&=+$,[]"); ?> % php urlenc.php -_.%21%7E%2A%27%28%29%3B%2F%3F%3A%40%26%3D%2B%24%2C%5B%5D
% cat UrlEnc.java import java.net.URLEncoder; public class UrlEnc { public static void main (String[] args) { try { System.out.println(URLEncoder.encode("-_.!~*\'();/?:@&=+$,[]","ISO-8859-1")); } catch(Exception e) { System.err.println(e); } } } % javac UrlEnc.java % java UrlEnc -_.%21%7E*%27%28%29%3B%2F%3F%3A%40%26%3D%2B%24%2C%5B%5D