いわゆる俗に言うURLエンコード
RFC 3986 では「:/?#[]@!$&'()*+,;=」をデリミタとして使う場合を除いて [-._~0-9a-zA-Z] 以外の全ての文字を % 表記にする模様。
参考:
URI.encode_www_form_component は ~ が %7E、スペースが + になるのに加えて * が変換されずに残る。
URI.escape は「:/?[]@!$&'()*+,;=」(「#」以外のデリミタ)が変換されずに残る。
それが問題にならないなら以下のようにも書ける。
RFC 3986 では「:/?#[]@!$&'()*+,;=」をデリミタとして使う場合を除いて [-._~0-9a-zA-Z] 以外の全ての文字を % 表記にする模様。
- Wikipedia / パーセントエンコーディング
LANG=C awk 'BEGIN{s=ARGV[1];for(i=0;i<256;i++)ord[sprintf("%c",i)]=i;for(i=1;i<=length(s);i++){c=substr(s,i,1);if(match(c,/[-._~0-9a-zA-Z]/))printf("%s",c);else printf("%%%02X",ord[c])}exit}'標準機能で文字コード→文字は出来るけど、文字→文字コードが出来ないので結構無理やり。LANG=C 入れとかないとマルチバイトが1文字扱いになるかも。
参考:
- Effective AWK Programming / Translating Between Characters and Numbers
ruby -e 'print "#{ARGV[0]}".force_encoding("BINARY").each_char.map{|c|/[-._~0-9a-zA-Z]/=~c ?c:"%%%02X"%[c.ord]}.join'CGI.escape は ~ が %7E、スペースが + になる。
URI.encode_www_form_component は ~ が %7E、スペースが + になるのに加えて * が変換されずに残る。
URI.escape は「:/?[]@!$&'()*+,;=」(「#」以外のデリミタ)が変換されずに残る。
それが問題にならないなら以下のようにも書ける。
ruby -rcgi -e 'print CGI.escape(ARGV[0])'
ruby -ruri -e 'print URI.encode_www_form_component(ARGV[0])'
ruby -ruri -e 'print URI.escape(ARGV[0])'
perl -MURI::Escape -e 'print uri_escape($ARGV[0])'参考:
- stackoverflow / URLEncode from a bash script
タグ
コメントをかく