ページ「リボルビング払い」と「C#でUrlEncodeとUrlDecode」の間の差分
(ページ間の差分)
ナビゲーションに移動
検索に移動
imported>Administrator |
imported>Administrator |
||
1行目: | 1行目: | ||
− | + | C#というか[[.NET]]にはUrlEncodeとUrlDecodeの統一的な方法がない。標準的に行う方法は、バージョンごと、プラットフォームごとに方法が異なりすぎて悲惨なことになっている。 | |
− | + | こんなもんStringクラスの拡張メソッドでいいだろ。アホか。 | |
− | = | + | <syntaxhighlight lang="csharp"> |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | == | + | |
− | + | 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> | ||
+ | |||
+ | [[category: .NET]] |
2018年8月14日 (火) 02:43時点における版
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);
}
}