C#でUrlEncodeとUrlDecode
2018年8月14日 (火) 02:43時点におけるimported>Administratorによる版
C#というか.NETにはUrlEncodeとUrlDecodeの統一的な方法がない。標準的に行う方法は、バージョンごと、プラットフォームごとに方法が異なりすぎて悲惨なことになっている。
こんなもんStringクラスの拡張メソッドでいいだろ。アホか。
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);
}
}