これを読んでみましょう。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
— 16 (@hex_life) March 28, 2013
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%fcABCDecodeしてみます。
Get-DecodeStringToShiftJIS "%8a%e6%92%a3%82%ea%8e%d0%92%7b%90%ed%90%fcABC"問題ないですね。
頑張れ社畜戦線ABC