以下の内容はhttps://tech.guitarrapc.com/entry/2013/03/30/020311より取得しました。


PowerShellでURLEncoding/Decodingしてみる

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

16 (@hex_life) March 28, 2013

これを読んでみましょう。

Encoding

%が外れているのはぱっと見で分かる事です。また%E3、この例ではE3が何処にもないので、UTF-8でもなく、Shift-JISであることが分かります。

よって、Encodingクラスで、Shift-JIS……PowerShellでいうところのdefaultを指定します。

Encoding クラス

$encode = [System.Text.Encoding]::default

Decode/Encodeするには

UTF-8ではなくShift-JISなので、.NETの[System.Web.HttpUtility]クラスにあるUrlDecodeメソッドが使えそうです。 HttpUtility クラス.aspx)

このアセンブリは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に指定するだけです。一応、%が抜けている場合と、正常なエンコードをされた場合に対応してあります。

PS> 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"
ヘックスは、多くの大学生にとっての楽しみです。

PS> 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"
ヘックスは、多くの大学生にとっての楽しみです。

UTF-8 EncodeのDecodeファンクション

encodeをUTF-8にするだけです。

これも、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に指定するだけです。%が抜けている場合と、正常なエンコードをされた場合に対応してあります。

PS> Get-DecodeStringToUTF8 -string "%e3%81%a7%e3%82%b5%e3%83%bc%e3%83%90%e7%9b%a3%e8%a6%96"
でサーバ監視

PS> 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
  }

}

ためしましょう。

PS> Get-EncodeStringToShiftJIS "頑張れ社畜戦線ABC"
%8a%e6%92%a3%82%ea%8e%d0%92%7b%90%ed%90%fcABC

Decodeしてみます。

PS> Get-DecodeStringToShiftJIS "%8a%e6%92%a3%82%ea%8e%d0%92%7b%90%ed%90%fcABC"
頑張れ社畜戦線ABC

まとめ

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




以上の内容はhttps://tech.guitarrapc.com/entry/2013/03/30/020311より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14