本題に入る前にまずは下記エントリーをご覧ください。
・64ビット版OfficeでURLエンコード処理ができない?に対する返信1
・64ビット版OfficeでURLエンコード処理ができない?に対する返信2
・64ビット版OfficeでURLエンコード処理ができない?に対する返信3
上記エントリーは、私が書いた「64ビット環境でのScriptControlの代わり」や「64ビット版OfficeでURLエンコード処理ができない?」といった記事をYU-TANGさんがさらに深く掘り下げてくださったもので、64ビット環境下でのURLエンコード処理を、いかにして自分で書かずに実装するかが詳しくまとまっています。
上記エントリーの中で特に注目したいのが「64ビット版OfficeでURLエンコード処理ができない?に対する返信3」で書かれている、PowerShell経由で.NETの機能を呼び出す方法。
今回はこれを元に文字コードを指定してURLエンコードを行う方法を紹介します(VBScript)。
Option Explicit MsgBox EncodeURL("あいうえお", "euc-jp") Private Function EncodeURL(ByVal TargetString, ByVal CodeName) Dim Cmd 'PowerShellの実行確認 On Error Resume Next CreateObject("WScript.Shell").Run "PowerShell -Version", 0 If Err.Number <> 0 Then Exit Function On Error GoTo 0 TargetString = Replace(TargetString, "`", "``") TargetString = Replace(TargetString, """", "`""""""") Cmd = "PowerShell -Command ""[void]([Reflection.Assembly]::LoadWithPartialName(""""""System.Web""""""));[Web.HttpUtility]::UrlEncode(""""""" & TargetString & """"""", [Text.Encoding]::GetEncoding(""""""" & CodeName & """""""))""" EncodeURL = CreateObject("WScript.Shell").Exec(Cmd).StdOut.ReadLine End Function
上記コードでは、HttpUtilityクラスのUrlEncodeメソッドをPowerShell経由で呼び出すことによって、文字コードを指定してURLエンコードを行っています。
上記EncodeURL関数の第二引数で指定しているコード名は「Encodingクラスで扱えるエンコーディング名は?[C#、VB]」や「Encoding.WebName プロパティ」あたりをご参照ください。
VBScriptからわざわざPowerShellを呼び出す、というのは明らかに無駄なように思いますが、”PowerShellが使用できるPCだけれども、処理はどうしてもVBScriptで行わなければいけない“というような、非常に特殊な状況下では役に立つかもしれません。(もしくは上記コードをVBAに直して既存のマクロに追加するときか…)
上記コードを応用すればVBS/VBAから自由に.NETの膨大な機能を利用することができるので、使いようによっては便利なのかもしれません。
最初からC#やPowerShellでコードを書けば良い、という意見を抜きにすれば。
この記事へのコメントはありません。