goo blog サービス終了のお知らせ 

GameSprit

自転車やMac・AppleScript、映画・小説やドラマのレビュー、備忘メモ・クイズなどを置いています。

AppleScript : URLエンコード

2011-01-08 15:50:01 | AppleScript
AppleScript で URLエンコード(URL Encode) を行います。

まず、設計。
インターフェースは display dialog で、テキストを入力。
URLエンコードを行なう心臓部はサブルーチン化。
エンコードし出力する文字コードは UTF-8 と EUCJP の2種類として、モード(mode)を
設けて切り替えます。
出力はクリップボードにコピーします。


インターフェース部

まず入力部。
エンコードしたいテキストを入力する枠と、エンコードし出力する文字コードを選ぶ2種類の
ボタンを設けます。

一応、動作確認。
set ans to (display dialog "エンコードする文字列を入力してください" default answer "" 
buttons {"UTF-8でエンコード", "EUCJPでエンコード"})
※ すべて1行で続ける

このコードを AppleScript エディタ に入力し、実行。




結果として、『{text returned:"こんにちは", button returned:"UTF-8でエンコード"}』が返ってきて、
変数 ans に格納されました。




橋渡し部

次に、インターフェースから返ってくるrecord形式のデータに含まれる URLエンコードしたい
文字列・モードを表わすbuttonを、心臓部分であるサブルーチンに橋渡しする部分を書いてみます。

ここでは、例えば変数ansに入っている『{text returned:"こんにちは", button returned:"UTF-8で
エンコード"}』というrecord形式のデータからtext returnedというラベルがついた値、"こんにちは" と、
button returnedというラベルがついた"UTF-8でエンコード"を、加工してサブルーチンに渡します。

なお、サブルーチンが要求する入力値は、input に入る文字列(テキスト、text)と、mode に入る
"U" あるいは "E" という文字(character) です。

では、『{text returned:"こんにちは", button returned:"UTF-8でエンコード"}』からinput
入る文字列を取り出しましょう。
set inPh to text returned of ans

変数inPhに文字列"こんにちは" を格納しました。

同様に、ボタンbuttonを取り出します。
set btn to button returned of ans

変数mode(次のステップでは、変数btnに変更しています)に"UTF-8でエンコード"という値の
buttonが格納されました。




サブルーチンが要求する文字列input には、変数inPhに入っている文字列"こんにちは" を
渡せばいいのです。

ただ、サブルーチンが要求する文字input には、"U" あるいは "E" という文字(character)を
渡すので、インターフェイスから送られてくるのが想定される2つのケース、(1) "button returned:"UTF-8でエンコード"、(2) "button returned:"EUCJPでエンコード" を加工します。

(1) "button returned:"UTF-8でエンコード" が送られてくれば、"U" をサブルーチンに渡し、
(2) "button returned:"EUCJPでエンコード" が送られてくれば、"E" をサブルーチンに渡すように
します。(そのように、サブルーチン内を設計しています)

(1)"UTF-8でエンコード"・(2)"EUCJPでエンコード" とも、文字列から1文字目を切り出せば
いいのです。

変数btnに入っている文字列の1文字目は『 first character of (btn as string) 』です。
取り出した1文字を変数modeに格納します。
set mode to first character of (btn as string)


URLエンコードするサブルーチンURLencoding(input, mode)を実行するには『my URLencoding(inPh, mode)』。
例では、『my URLencoding("こんにちは", "U")』というものが実行されます。


サブルーチンの実行結果はクリップボードに貼り付けます『set the clipboard to ~』。
set the clipboard to my URLencoding(inPh, mode)

実行結果の "%e3%81%93%e3%82%93%e3%81%ab%e3%81%a1%e3%81%af" が
クリップボードに貼り付けられます。





サブルーチン部

サブルーチン化したのは、他に効率的なやり方が見つかれば、サブルーチン内を書き換えることで
対応できるからです。

さて、このサブルーチンの仕組みです。
on URLencoding(input, mode)
	-- modeが"U"のときUTF-8、"E"のときEUCJPで出力します
	set wordB4encode to input
	set cmdPre to "echo "
	
	if mode is "U" then set cmdSuf to "| iconv -t UTF-8 | perl -pe '~s/x0Dx0A|x0D|x0A//g;' | 
 perl -pe '~s/([^?w ])/"%".unpack("H2", $1)/eg;'"
	if mode is "E" then set cmdSuf to "| iconv -t EUCJP  | perl -pe '~s/x0Dx0A|x0D|x0A//g;' | 
 perl -pe '~s/([^?w ])/"%".unpack("H2", $1)/eg;'"
	
	set theCompleteCmd to (cmdPre & wordB4encode & cmdSuf) as string
	set wordAftEncode to (do shell script theCompleteCmd)
	
	return wordAftEncode
end URLencoding

※1 if で始まる行は『eg;'"』まで1行で入力。
※2 『¥』は、実際は半角の『\』です([option]+ で入力)



このサブルーチンでは、仕組みとして Mac OS X の コマンドラインを活用しています。
概略として、次の3つの根本的な処理を行っています。

 (1) perl で URLエンコードする部分
 (2) perl で改行コードをLFからCR(Mac OS X のファイルシステムでの改行コード)に置換する部分
 (3) iconv で文字コードを変更する部分

サブルーチンへの入力値の1つ、文字"U" あるいは "E" で処理を切り替え、2つめの入力値である
URLエンコードする文字列をシェルスクリプトに渡しています。


最後は、変数wordAftEncodeにURLエンコード済みの文字列を入れてサブルーチン外に出力します。



キーワード:AppleScriptURLエンコードURL Encodedisplay dialogサブルーチンUTF-8EUCJPtext returnedbutton returnedrecordMac OS Xコマンドラインシェルスクリプトdo shell scriptperliconvワンライナー

最新の画像もっと見る

post a comment

サービス終了に伴い、10月1日にコメント投稿機能を終了させていただく予定です。
ブログ作成者から承認されるまでコメントは反映されません。