「C#でUrlEncodeとUrlDecode」の版間の差分
imported>Administrator ページの作成:「C#というか.NETにはUrlEncodeとUrlDecodeの統一的な方法がない。標準的に行う方法は、バージョンごと、プラットフォームごとに方...」 |
imported>Administrator 編集の要約なし |
||
| (同じ利用者による、間の5版が非表示) | |||
| 1行目: | 1行目: | ||
C#というか. | C#というか[[.NET]]にはUrlEncodeとUrlDecodeの統一的な方法がない。標準的に行う方法は、バージョンごと、プラットフォームごとに方法が異なりすぎて悲惨なことになっている。 | ||
こんなもんStringクラスの拡張メソッドでいいだろ。アホか。 | |||
<syntaxhighlight lang="csharp"> | |||
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); | |||
} | |||
} | |||
</syntaxhighlight> | </syntaxhighlight> | ||
[[category: .NET]] | |||
2018年8月14日 (火) 04:29時点における最新版
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);
}
}