メインメニューを開く

差分

C#でUrlEncodeとUrlDecode

525 バイト追加, 2018年8月14日 (火) 02:43
編集の要約なし
C#というか[[.NET]]にはUrlEncodeとUrlDecodeの統一的な方法がない。標準的に行う方法は、バージョンごと、プラットフォームごとに方法が異なりすぎて悲惨なことになっている。
 
こんなもんStringクラスの拡張メソッドでいいだろ。アホか。
<syntaxhighlight lang="csharp">
static class StringExtensions { public static string UrlEncode( this string s str, Encoding enc ) { var rt = new StringBuilder(); foreach ( byte i in enc.GetBytes( s 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 lang="csharp">
public static string UrlDecode( string s , Encoding enc )
{
var bytes = new List<byte>();
for ( int i = 0; i < s.Length; i++ )
{
char c = s[i];
if ( c == '%' )
{
bytes.Add( (byte)int.Parse( s[++i].ToString() + s[++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]]
匿名利用者