首页 > 其他分享 >HttpUtility.UrlEncode和Uri.EscapeDataString的区别V2024

HttpUtility.UrlEncode和Uri.EscapeDataString的区别V2024

时间:2024-10-16 09:32:00浏览次数:1  
标签:UrlEncode V2024 builder Uri HttpUtility ToString EscapeDataString

HttpUtility.UrlEncode和Uri.EscapeDataString的区别

 

先上代码:

 

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 对整个字符编码。 应该就可以验证通过。

 

标签:UrlEncode,V2024,builder,Uri,HttpUtility,ToString,EscapeDataString
From: https://www.cnblogs.com/runliuv/p/18469008

相关文章

  • 一文搞懂 URI 和 URL
    文章目录前言URIURI通用组成部分URLURL的常见定义格式方案(scheme)权威(authority)主机名(Host)端口号(Port)路径(Path)查询参数(Query)片段(Fragment)URNURN的基本结构特点用途三者的区别和联系前言在日常中我们打开浏览器访问网站时需要输入网址,如:http://127.0.0.1:8......
  • OSCP(Offensive Security Certified Professional)考证全...
     一、OSCP认证是什么?首先介绍下OSCP认证,目前安全技术类的证书有很多,像是CEH,Security+,CISSP等等。除了众多侧重于笔试的安全认证,OSCP(OffensiveSecurityCertifiedProfessional)是为数不多得到国际认可的安全实战类认证。目前在国外受到广泛认可,在台湾、香港等地区也比较......
  • tauri2.0-admin桌面端后台系统|tauri2+vite5+element-plus管理后台EXE程序
    原创Tauri2.0+Vue3+ElementPlus客户端通用后台管理系统Tauri2Admin。tauri2-vue3-admin基于最新跨平台框架Tauri2.0整合Vite5+Vue3全家桶搭建的一款轻量级桌面端后台管理系统模板。封装tauri2多窗口切换管理,提供4种通用布局模板,支持vue-i18n国际化、面包屑导航、多标签快捷路......
  • WebSecurityConfigurerAdapter 关于成功之后页面跳转的配置
    packagecom.feitai.auth.config;importcom.feitai.manager.PtfUserDetailsManager;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.context.annotation.Configuration;importorg.springframework.security.config.annota......
  • 五、Spring Boot集成Spring Security之认证流程2
    二、概要说明上文已详细介绍了四、SpringBoot集成SpringSecurity之认证流程本文则着重介绍用户名密码认证过滤器UsernamePasswordAuthenticationFilter的实现原理过程认证管理器(authenticationManager)认证提供者(AuthenticationProvider)自定义配置用户名密码实现(UserDetail......
  • 四、Spring Boot集成Spring Security之认证流程
    二、概要说明本文主要介绍登录登出业务流程,所以使用基于内存的用户名密码,暂不介绍授权相关内容,后续会详细介绍基于数据库的认证及授权如何查看基于内存的默认用户名密码如何配置基于内存的自定义用户名密码本文与上文有强关联性,如果对过滤器链中登录相关的过滤器不熟悉的同学......
  • 【Spring Security OAuth2】- Spring Social第三方登录 - 集群session管理
    作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!阶段1、深入多线程阶段2、深入多线程设计模式阶段3、深入juc源码解析阶段4、深入jdk其余源码解析......
  • 【Spring Security OAuth2】- Spring Social第三方登录 - 单机session管理
    作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!阶段1、深入多线程阶段2、深入多线程设计模式阶段3、深入juc源码解析阶段4、深入jdk其余源码解析......
  • 在K8S中,PodSecurityPolicy机制能实现哪些安全策略?
    在Kubernetes中,PodSecurityPolicy(PSP)是一种集群级别的资源对象,用于控制Pod如何运行,并确保其符合一定的安全要求。虽然PSP已经在Kubernetes1.21版本中被标记为弃用,并将在未来的版本中被移除,但在支持它的环境中,PSP可以实现多种安全策略。以下是一些PSP可以实现的安全策略示例:用......
  • 三、Spring Boot集成Spring Security之securityFilterChain过滤器链详解
    二、默认过滤器链1、默认配置系统启动日志2、默认配置的过滤器及顺序如下org.springframework.security.web.session.DisableEncodeUrlFilterorg.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilterorg.springframework.security.web.c......