tech.guitarrapc.cóm

Technical updates

PowerShellでURLEncoding/Decodingしてみる

良くあるパターンではあるものの、そういえば試したことが無かったです。 今回のお題はこちら。 これを読んでみましょう。

Encoding

%が外れているのはぱっと見で分かる事です。 また、%E3 、この例ではE3 が何処にもないので、UTF8でもなく、Shift-JISであることが分かります。 よって、Encodingクラスで、Shift-JIS……PowerShellでいうところのdefaultを指定します。
Encoding クラス
$encode = [System.Text.Encoding]::default

Decode/Encodeするには

UTF8ではなくShift-JISなので、.NETの[System.Web.HttpUtility]クラスにあるUrlDecodeメソッドが使えそうです。
HttpUtility クラス
このアセンブリはPowerShellではデフォルトで読み込まれていません。 読み込むためには……PowerShell 2.0以降なら、Add-Type -AssemblyNameですね。
Add-Type -AssemblyName System.Web
また、対象文字が半角スペース区切りなので、-replace演算子で、" ","%"がつかえそうです。 ついでに、頭に%を付ける必要があります。 以上を踏まえて、書くとこうですね。
Add-Type -AssemblyName System.Web
$encode = [System.Text.Encoding]::default
$string = "%"
$string += "83 77 83 62 83 4E 83 58 82 CD 81 41 91 BD 82 AD 82 CC 91 E5 8A 77 90 B6 82 C9 82 C6 82 C1 82 C4 82 CC 8A 79 82 B5 82 DD 82 C5 82 B7 81 42"
$string = $string -replace " ","%"
[System.Web.HttpUtility]::UrlDecode($string,$encode)
でDecodeすると。
ヘックスは、多くの大学生にとっての楽しみです。
ネタかいっ!!って感じでしたがまぁいいです。

Shift-JIS EncodeのDecodeファンクション

せっかくなので、function化しておきましょう。
function Get-DecodeStringToShiftJIS{

    [CmdletBinding(
        SupportsShouldProcess = $false,
        ConfirmImpact = "none",
        DefaultParameterSetName = ""
    )]
    param(
        [Parameter(
        HelpMessage = "Input Encoded String you want Decode as Shift-JIS.",
        Position = 0,
        Mandatory = $true,
        ValueFromPipeline = $true,
        ValueFromPipelineByPropertyName = $true
        )]
        [ValidateNotNullOrEmpty()]
        [string]
        $string=""
    )

        begin
    {

        #Initialize newString for more than 2nd try during same runspace
        $newString = $null

        try
        {
            # Set encoding to Shift-JIS (means default)
            $encode = [System.Text.Encoding]::default
        }
        catch
        {
            # Already encoding defined.
        }

        try
        {
            # Add AssemblyName
            Add-Type -AssemblyName System.Web
        }
        catch
        {
            # Already Added Assembly
        }

    }

    process
    {
        $firtCharOfString = "%"


        # Check string format contains % or not
        if($string.Substring(0,1) -ne $firtCharOfString)
        {
            $newString = $firtCharOfString
            $newString += $string -replace " ",$firtCharOfString
        }
        else
        {
            $newString += $string
        }

        try
        {
            $decodedString = [System.Web.HttpUtility]::UrlDecode($newString,$encode)
        }
        catch
        {
            # Urldecode failed
        }

    }

    end
    {
        $decodedString

        # Check new string to decode
        #$newString
    }

}
利用する際は、文字列を-stringに指定するだけです。
Get-DecodeStringToShiftJIS -string "83 77 83 62 83 4E 83 58 82 CD 81 41 91 BD 82 AD 82 CC 91 E5 8A 77 90 B6 82 C9 82 C6 82 C1 82 C4 82 CC 8A 79 82 B5 82 DD 82 C5 82 B7 81 42"
Get-DecodeStringToShiftJIS -string "%83%77%83%62%83%4E%83%58%82%CD%81%41%91%BD%82%AD%82%CC%91%E5%8A%77%90%B6%82%C9%82%C6%82%C1%82%C4%82%CC%8A%79%82%B5%82%DD%82%C5%82%B7%81%42"
一応、%が抜けている場合と、正常なエンコードをされた場合に対応してあります。 結果です。
ヘックスは、多くの大学生にとっての楽しみです。
ヘックスは、多くの大学生にとっての楽しみです。

UTF8 EncodeのDecodeファンクション

encodeをUTF8にするだけです。 これも、function化しておきましょう。
function Get-DecodeStringToUTF8{

    [CmdletBinding(
        SupportsShouldProcess = $false,
        ConfirmImpact = "none",
        DefaultParameterSetName = ""
    )]
    param(
        [Parameter(
        HelpMessage = "Input Encoded String you want Decode as UTF8.",
        Position = 0,
        Mandatory = $true,
        ValueFromPipeline = $true,
        ValueFromPipelineByPropertyName = $true
        )]
        [ValidateNotNullOrEmpty()]
        [string]
        $string=""
    )

        begin
    {

        #Initialize newString for more than 2nd try during same runspace
        $newString = $null

        try
        {
            # Set encoding to UTF8
            $encode = [System.Text.Encoding]::UTF8
        }
        catch
        {
            # Already encoding defined.
        }

        try
        {
            # Add AssemblyName
            Add-Type -AssemblyName System.Web
        }
        catch
        {
            # Already Added Assembly
        }

    }

    process
    {
        $URIencodingCheck = "%"

        # Check string format contains % or not
        if($string.Substring(0,1) -ne $URIencodingCheck)
        {
            $newString = $URIencodingCheck
            $newString += $string -replace " ",$URIencodingCheck
        }
        else
        {
            $newString += $string
        }

        try
        {
            $decodedString = [System.Web.HttpUtility]::UrlDecode($newString,$encode)
        }
        catch
        {
            # Urldecode failed
        }

    }

    end
    {
        $decodedString

        # Check new string to decode
        #$newString
    }

}
利用する際は、文字列を-stringに指定するだけです。
Get-DecodeStringToUTF8 -string "%e3%81%a7%e3%82%b5%e3%83%bc%e3%83%90%e7%9b%a3%e8%a6%96"
Get-DecodeStringToUTF8 -string "e3 81 a7 e3 82 b5 e3 83 bc e3 83 90 e7 9b a3 e8 a6 96"
一応、%が抜けている場合と、正常なエンコードをされた場合に対応してあります。 結果です。
でサーバ監視
でサーバ監視

Shift-JIS へのEncodeファンクション

勿論Encodeも簡単な訳で。
function Get-EncodeStringToShiftJIS{

    [CmdletBinding(
        SupportsShouldProcess = $false,
        ConfirmImpact = "none",
        DefaultParameterSetName = ""
    )]
    param(
        [Parameter(
        HelpMessage = "Input String you want Encode as Shift-JIS.",
        Position = 0,
        Mandatory = $true,
        ValueFromPipeline = $true,
        ValueFromPipelineByPropertyName = $true
        )]
        [ValidateNotNullOrEmpty()]
        [string]
        $string=""
    )

        begin
    {

        try
        {
            # Set encoding to Shift-JIS (means default)
            $encode = [System.Text.Encoding]::default
        }
        catch
        {
            # Already encoding defined.
        }

        try
        {
            # Add AssemblyName
            Add-Type -AssemblyName System.Web
        }
        catch
        {
            # Already Added Assembly
        }

    }

    process
    {
        $firtCharOfString = "%"


        # Check string format contains % or not
        try
        {
            $EncodedString = [System.Web.HttpUtility]::UrlEncode($string,$encode)
        }
        catch
        {
            # Urldecode failed
        }

    }

    end
    {
        $EncodedString
    }

}
ためしましょう。
Get-EncodeStringToShiftJIS "頑張れ社畜戦線ABC"
結果です。
%8a%e6%92%a3%82%ea%8e%d0%92%7b%90%ed%90%fcABC
Decodeしてみます。
Get-DecodeStringToShiftJIS "%8a%e6%92%a3%82%ea%8e%d0%92%7b%90%ed%90%fcABC"
問題ないですね。
頑張れ社畜戦線ABC

まとめ

基本的には、この辺はC#やVB.NETと変わらずお手軽に出来ます。