Help us understand the problem. What is going on with this article?

PowerShellでパーセントエンコーディング

More than 3 years have passed since last update.

パーセントエンコーディングとは

httpプロトコルでPOSTやGETするときにURIに使える文字が決まっています.
なので使えない文字は16進数に変換して,文字の前に%をつけることて,利用する必要があります.この変換を文字列に行うのがパーセントエンコーディングです.

.NET Frameworkでのパーセントエンコーディング

Uri.EscapeDataString というメソッドでできることになっているのですが,version 4.0だと、RFC2396.version 4.5 だと RFC3986.それぞれ違う規約によってエンコーディングされるようです.私の環境のPowerShellの.NET Frameworkのversionは4.0なので,RFC2396にエンコードされます.しかし今回私はtwitterのAPIの利用がしたかったので,それに必要なRFC3986にエンコードする関数を制作しました.

function EncordString ([System.String]$inputstring) {
    #RFC3986でパーセントエンコーディング
    $inputchars=[System.Text.Encoding]::GetEncoding("utf-8").GetBytes($inputstring)
    #元の文字列のエンコードがUTF-8以外の場合はそのエンコードに書き換えてください.
    $encorded=New-Object System.Text.StringBuilder
    foreach($ch in $inputchars)
    {
        if((0x30-le$ch-and$ch-le0x39)`
        -or (0x41 -le $ch -and $ch -le 0x5A)`
        -or (0x61 -le $ch -and $ch -le 0x7A)`
        -or (0x2D -eq $ch -or 0x2E -eq $ch`
        -or 0x5F -eq $ch -or 0x7E -eq $ch))
        #'0'以上'9'未満
        #'A'以上'Z'未満
        #'a'以上'z'未満
        #その他使用できる文字(‘-‘, ‘.’, ‘_’, ‘~’)
        {
            [void]$encorded.Append([System.Convert]::ToChar($ch))
        }else {
            [void]$encorded.Append("%{0:X2}" -f [int]$ch)   
        }
    }
    $encorded.ToString()
}

参考文献

Percent encoding parameters
https://dev.twitter.com/oauth/overview/percent-encoding-parameters
URLエンコード、URLデコードを行う
http://dobon.net/vb/dotnet/internet/urlencode.html
[C#] string(文字列)からバイト型配列 byte に変換する
https://www.ipentec.com/document/document.aspx?page=csharp-string-to-bytearray&culture=ja-jp

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away