「C#でUrlEncodeとUrlDecode」を編集中
ナビゲーションに移動
検索に移動
この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 | 編集中の文章 | ||
1行目: | 1行目: | ||
− | C#というか | + | C#というか.NETにはUrlEncodeとUrlDecodeの統一的な方法がない。標準的に行う方法は、バージョンごと、プラットフォームごとに方法が異なりすぎて悲惨なことになっている。 |
− | |||
− | |||
<syntaxhighlight lang="csharp"> | <syntaxhighlight lang="csharp"> | ||
− | + | public static string UrlEncode( string s , Encoding enc ) | |
− | + | { | |
− | + | var rt = new StringBuilder(); | |
− | + | foreach ( byte i in enc.GetBytes( s ) ) | |
− | + | { | |
− | + | 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(); | |
− | + | } | |
− | |||
− | |||
− | + | </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> | </syntaxhighlight> | ||
− | |||
− |