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