runliuv

runliuv@cnblogs

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

HttpUtility.UrlEncode和Uri.EscapeDataString的区别V2024

 

先上代码:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;

namespace ConsoleUrlEncode
{
    class Program
    {
        static void Main(string[] args)
        {
            string url = "C++C#()";
            Console.WriteLine("HttpUtility.UrlEncode1:      " + HttpUtility.UrlEncode(url));
            Console.WriteLine("HttpUtility.UrlEncode 自定义:" + UrlEncode1(url));
            Console.WriteLine("Uri.EscapeDataString 自定义: " + UrlEncode2(url));
            Console.WriteLine("Uri.EscapeDataString:        " + Uri.EscapeDataString(url));
            Console.WriteLine("1");
            Console.ReadKey();
        }

        /// <summary>
        /// 使用 HttpUtility.UrlEncode,需要encode的字符转大写
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static string UrlEncode1(string str)
        {
            StringBuilder builder = new StringBuilder();
            foreach (char c in str)
            {
                if (HttpUtility.UrlEncode(c.ToString(), Encoding.UTF8).Length > 1)
                {
                    builder.Append(HttpUtility.UrlEncode(c.ToString(), Encoding.UTF8).ToUpper());
                }
                else
                {
                    builder.Append(c);
                }
                //if (Uri.EscapeDataString(c.ToString()).Length > 1)
                //{
                //    builder.Append(Uri.EscapeDataString(c.ToString()).ToUpper());
                //}
                //else
                //{
                //    builder.Append(c);
                //}

            }
            return builder.ToString();
        }

        /// <summary>
        /// 使用 Uri.EscapeDataString,需要encode的字符转大写
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static string UrlEncode2(string str)
        {
            StringBuilder builder = new StringBuilder();
            foreach (char c in str)
            {
                //if (HttpUtility.UrlEncode(c.ToString(), Encoding.UTF8).Length > 1)
                //{
                //    builder.Append(HttpUtility.UrlEncode(c.ToString(), Encoding.UTF8).ToUpper());
                //}
                //else
                //{
                //    builder.Append(c);
                //}
                if (Uri.EscapeDataString(c.ToString()).Length > 1)
                {
                    builder.Append(Uri.EscapeDataString(c.ToString()).ToUpper());
                }
                else
                {
                    builder.Append(c);
                }

            }
            return builder.ToString();
        }
    }
}

看下输出:

HttpUtility.UrlEncode1:      C%2b%2bC%23()
HttpUtility.UrlEncode 自定义:C%2B%2BC%23()
Uri.EscapeDataString 自定义: C%2B%2BC%23%28%29
Uri.EscapeDataString:        C%2B%2BC%23%28%29

 

 

使用HttpUtility.UrlEncode,会把要encdoe字符转义成小写,+号被转义成 %2b,而括号 () 不会被编码。 JAVA 那边默认风格是转大写,经常遇到报签名错误的,一般是这个原因引起的。

网上找的“public static string UrlEncode1(string str)”方法,只是把要编码的字符转成大写而已,而括号 () 不会被编码。

UrlEncode2 是仿UrlEncode1写的,只不过判定是否要编码,从HttpUtility.UrlEncode换成Uri.EscapeDataString。

UrlEncode2 和 直接使用 Uri.EscapeDataString 对整个字符编码,结果是一致的,还不如直接用 Uri.EscapeDataString,而不用 UrlEncode2方法。

 Uri.EscapeDataString:1.遇到要编码的,会转成大写。2.括号 () 也会被编码。

所以有遇到和其它语言进行签名交互时,直接用 Uri.EscapeDataString 对整个字符编码。 应该就可以验证通过。

 

posted on 2024-10-16 09:40  runliuv  阅读(8)  评论(0编辑  收藏  举报