REALbasicでURLデコードできなかったのでPerlに頼る(2)

前回までのあらすじ

REALbasicだけでURLデコードを試みるが、頭が弱いせいでどうにもならず
REALbasicに組み込めるAppleScriptでなんとか妥協しようとするが、これでもどうにもならず
最終的にREALbasicからMac OS XのターミナルというかShellをREALbasicの内部で実行させてPerlでなんとかしようと思ったが
Perlスクリプトをハードディスクに置かずにターミナル上で実行させるには「Perl -e 'コマンド'」としなければならないようだが
こういう書き方をするには1行で書かないといけないことが判明し、どうにかURLデコードプログラムを1行で書こうとしていた
ーーーーーーーーーーーー


まず前回までに書いたPerlスクリプト
strという変数に“%E7%94%B7”を与えて処理させているが、これは「男」という文字をURLエンコードしたもの。


$str = "%E7%94%B7";
$str =~ tr/+/ /;
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
print($str);


本当に簡単なことで解けるのだが、こんなことに数時間かけてしまった。

解は

perl -e '$str = "%E7%94%B7"; $str =~ tr/+/ /; $str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg; print($str);'

行の終わりである【 ; 】の次に半角スペースを入れたら、次の行を始めてもいいようだ。すごくね?
いや、ぜんぜんすごくない。




さて、次は上記の解をREALbasicで内部で作ったShellで実行させるという段階に。
基本的には


Dim s as New Shell
s.Execute ("コマンド")


とすると、s.Resultで結果が取り出せるので簡単に画面に出力するだけなら
msgbox(s.Result)としてやればなんとかなるのだ。


つまり、実用的な例を示すと a という String型 の変数に「%E7%94%B7」つっこんであげて、それを処理させる場合は


Dim s As New Shell
Dim a As String
a="%E7%94%B7"
s.Execute ("perl -e '$str = "+a+"; $str =~ tr/+/ /; $str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg; print($str);'")
msgbox(s.Result)


これでおっけ。あとは、もし a の中身が変化しても、Perlスクリプトはいじらずに自由自在なわけだ!!!すごくね?
いや、べつにすごくないかもしれないけど、俺の脳内では革命でも起きたかのような気分だった


次に発生した問題は、デコードしたら文字化けしちゃう問題。


FirefoxSafariを使ってNow Headline X Remoteに組み込んだ上記のコードをテストしたところ、なぜかデコードした文字列が文字化けしている。
URLエンコードの仕様では、別にどの文字コードをURLエンコードしてしまってもいいことになっているっぽいので
UTF-8の文字列をURLエンコードしたものやら、Shift-JISをURLエンコードしたものを判別する必要がでてくる。


REALbasic内部では全部Unicode(UTF-8)の文字コードを使っているらしく、SafariFirefoxUTF-8でURLをエンコードしているらしいので
そのままデコードすればOKかとおもいきや、何故かうまくいかなかったので、REALbasicUTF-8からUTF-8文字コード変換するという全く無意味に思えるコードを追加したところ
これまた何故かうまく動くようになった。意味不明wwww



Dim s As New Shell
Dim a As String
Dim t As New TextConverter
t=GetTextConverter(encodings.UTF8, encodings.UTF8)
a="%E7%94%B7"
s.Execute ("perl -e '$str = "+a+"; $str =~ tr/+/ /; $str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg; print($str);'")
msgbox(t.convert(s.Result))



さらにさらに問題が発生し続ける。
上記のコードではSafariFirefoxから送られてきたURLエンコードした文字列は大丈夫だったが
手元にある携帯電話(auW54SA)でEZwebブラウザからアクセスしてみたところ、見事にこれが文字化け。


調べてみると、au端末のEZwebブラウザはShift-JISをURLエンコードする仕様になっているそうなのだが
Now Headline X Remoteの「番組の検索」フィールドでは単語を4文字程度しか入れずに検索することも多く
文字数が短いと文字コードの自動判定に失敗することも多々あるそうなので、めんどくさいので
User-Agentによってムリヤリ文字コード判定することにした。


User-Agentに「Mozilla」が入っているものは「UTF-8」、そうじゃないのは「Shift-JIS」で扱うというムチャクチャな仕様だ。
本当にこんなんでいいのかどうかわからないが、これでNow Headline X 4.1リリースにしようとおもう。


NTTドコモはテスト環境がないので不明、Softbank mobileはポート80以外に出て行けないのでそもそも対象外
あれ、iPhoneは大丈夫なのかな?