harukazepc’s blog

インターネッツとAndroidなどが大好きです。あとは日々のことなど。

URLエンコードってやつ

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
© harukazepc️