C#でUrlEncodeとUrlDecode

提供: MonoBook
2018年8月14日 (火) 04:29時点におけるimported>Administratorによる版
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

C#というか.NETにはUrlEncodeとUrlDecodeの統一的な方法がない。標準的に行う方法は、バージョンごと、プラットフォームごとに方法が異なりすぎて悲惨なことになっている。

こんなもんStringクラスの拡張メソッドでいいだろ。アホか。

    public static class StringExtensions
    {
        public static string UrlEncode(this string str, Encoding enc)
        {
            var rt = new StringBuilder();
            foreach (byte i in enc.GetBytes(str))
            {
                if (i == 0x20)
                {
                    rt.Append('+');
                }
                else if ((0x30 <= i && i <= 0x39) || (0x41 <= i && i <= 0x5a) || (0x61 <= i && i <= 0x7a))
                {
                    rt.Append((char)i);
                }
                else
                {
                    rt.Append("%" + i.ToString("X2"));
                }
            }
            return rt.ToString();
        }

        public static string UrlDecode(this string str, Encoding enc)
        {
            var bytes = new List<byte>();
            for (int i = 0; i < str.Length; i++)
            {
                char c = str[i];
                if (c == '%')
                {
                    bytes.Add((byte)int.Parse(str[++i].ToString() + str[++i].ToString(), System.Globalization.NumberStyles.HexNumber));
                }
                else if (c == '+')
                {
                    bytes.Add((byte)0x20);
                }
                else
                {
                    bytes.Add((byte)c);
                }
            }
            return enc.GetString(bytes.ToArray(), 0, bytes.Count);
        }
    }