「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]] | |||