Home‎ > ‎ProgramTool‎ > ‎Ruby‎ > ‎

UnicodeEscape

090410_10_00

coteditorには、外部スクリプトをマクロとして実行できる機能がある。
そこで、url文字列のパラメタを調べるのに、読みやすいように分割してデコードするマクロを書いた。

ところが、URLエンコードされた文字列の中に、
%uxxxx といった形式の文字列が入っていることがある。
これは、ユニコードがエスケープされたモノらしいのだけど、
これをデコードするrubyのスクリプトがすぐに見つからなくてちょっと困った。

普通の%エンコードされているモノだと

require "uri"
URI.unescape(strings)

+や細かいところはおいておくとして、これで大体デコードできる。
今回、プログラムで使うと言うよりは、中身を確認したいだけなので、細かいことは気にしていない。

で、件の%uxxxx なのだが、通常は \uxxxx といった形で表記されるモノらしい。
コレを直接デコードするメソッドがrubyにはないみたいなのだ。

で、しばらく調べている内に、Simple JSON parser & builder ってのが見つかった。
http://webos-goodies.jp/archives/51071565.html

class JsonParser の中に def unescape_string(str) というプライベートメソッドが定義されている。
これが、丁度目的のモノだった。
/uxxxx 形式を文字に戻してくれる。

この部分だけ取り出して、使わせてもらった。
RUBY19 の部分だけ定数が使われている。

RUBY19             = RUBY_VERSION >= '1.9.0' 

後は何にも依存していないので、メソッドをコピーしてそのまま動く。

まず、普通に URI.unescape(strings) で、デコードしておいて、
残った部分の %uxxxx を /uxxxxに置換して
unescape_string(strings) をかけてやればいい。

while line = gets
  line.chomp.split(/&/).each do | param |
    strings = URI.unescape(param.gsub("="," = ")).gsub(/%u([0-9a-fA-F]{4})/){ "\\u"+$1 }
    print unescape_string(strings),"\n"
  end
  print "------------------\n"
end
Comments