深入解析C#中的URI和URL编码:理解EscapeDataString、EscapeUriString和UrlEncode的区别及字符编码错误处理
在C#中,处理URI(统一资源标识符)和URL(统一资源定位符)时,可以使用Uri.EscapeDataString、Uri.EscapeUriString和HttpUtility.UrlEncode(或WebUtility.UrlEncode)方法来编码字符串。这些方法在处理编码时各有不同的用途和行为。以下是它们的区别以及在加密过程中遇到字符编码错误时的解析方法。
1. Uri.EscapeDataString
用途
- 用于对URI的数据部分进行编码。
- 将所有非字母数字字符(包括空格)转换为其百分号编码形式。
示例
using System;class Program
{static void Main(){string data = "Hello World! 你好,世界!";string escapedData = Uri.EscapeDataString(data);Console.WriteLine($"Escaped Data: {escapedData}");}
}
输出
Escaped Data: Hello%20World%21%20%E4%BD%A0%E5%A5%BD%EF%BC%8C%E4%B8%96%E7%95%8C%EF%BC%81
2. Uri.EscapeUriString
用途
- 用于对整个URI进行编码。
- 保留URI中的保留字符(如
?、/、#等),不对它们进行编码。
示例
using System;class Program
{static void Main(){string uri = "http://example.com/path?query=Hello World!";string escapedUri = Uri.EscapeUriString(uri);Console.WriteLine($"Escaped URI: {escapedUri}");}
}
输出
Escaped URI: http://example.com/path?query=Hello%20World!
3. HttpUtility.UrlEncode / WebUtility.UrlEncode
用途
- 用于将字符串编码为
application/x-www-form-urlencoded格式。 - 将空格转换为加号(
+),并对其他特殊字符进行百分号编码。
示例
using System;
using System.Web;class Program
{static void Main(){string data = "Hello World! 你好,世界!";string encodedData = HttpUtility.UrlEncode(data);Console.WriteLine($"Encoded Data: {encodedData}");}
}
输出
Encoded Data: Hello+World%21+%E4%BD%A0%E5%A5%BD%EF%BC%8C%E4%B8%96%E7%95%8C%EF%BC%81
加密过程中遇到的字符编码错误解析
在处理URI和URL编码时,可能会遇到字符编码错误。这些错误通常是由于未正确处理特殊字符或非ASCII字符导致的。以下是一些常见的字符编码错误及其解决方法:
1. 非ASCII字符未正确编码
如果字符串中包含非ASCII字符(如中文字符),在未正确编码的情况下可能会导致URI无效或解析错误。
解决方法
使用适当的编码方法(如Uri.EscapeDataString或HttpUtility.UrlEncode)来确保所有非ASCII字符都被正确编码。
示例
using System;class Program
{static void Main(){string data = "你好,世界!";string escapedData = Uri.EscapeDataString(data); // 或 HttpUtility.UrlEncode(data)Console.WriteLine($"Escaped Data: {escapedData}");}
}
2. 保留字符未正确处理
URI中的保留字符(如?、/、#等)在某些情况下可能会导致URI解析错误,特别是当它们用于数据部分时。
解决方法
根据具体情况选择合适的编码方法:
- 对数据部分使用
Uri.EscapeDataString。 - 对整个URI使用
Uri.EscapeUriString,并确保保留字符在适当的位置。
示例
using System;class Program
{static void Main(){string uri = "http://example.com/path?query=Hello World!";string escapedUri = Uri.EscapeUriString(uri);Console.WriteLine($"Escaped URI: {escapedUri}");}
}
总结
Uri.EscapeDataString:用于对URI数据部分进行编码,将所有非字母数字字符转换为百分号编码。Uri.EscapeUriString:用于对整个URI进行编码,保留URI中的保留字符。HttpUtility.UrlEncode/WebUtility.UrlEncode:用于将字符串编码为application/x-www-form-urlencoded格式,将空格转换为加号,并对其他特殊字符进行百分号编码。
在加密过程中,选择适当的编码方法可以确保URI和URL的有效性和安全性。遇到字符编码错误时,通过正确处理非ASCII字符和保留字符,可以有效解决编码问题。
当然,在文章的最后为每个编码方法添加一个实际的应用示例。这样可以帮助读者更好地理解如何在实际项目中使用这些方法。以下是对每种方法的具体示例:
实战示例:URI和URL编码方法的应用
1. Uri.EscapeDataString 实战示例
场景:生成安全的API请求
在实际项目中,可能需要生成包含用户输入的API请求URL。使用Uri.EscapeDataString可以确保用户输入中的特殊字符被正确编码,从而避免URL解析错误。
示例代码:
using System;class Program
{static void Main(){string userInput = "Search term with special characters: #, &, ?!";string baseUrl = "https://api.example.com/search";// 使用Uri.EscapeDataString对用户输入进行编码string encodedInput = Uri.EscapeDataString(userInput);string apiUrl = $"{baseUrl}?query={encodedInput}";Console.WriteLine($"API URL: {apiUrl}");}
}
输出:
API URL: https://api.example.com/search?query=Search%20term%20with%20special%20characters%3A%20%23%2C%20%26%2C%20%3F%21
2. Uri.EscapeUriString 实战示例
场景:处理完整的URI
当你需要对一个完整的URI进行编码时,使用Uri.EscapeUriString是合适的。这个方法会保留URI中的保留字符,如斜杠和问号,但对其他字符进行编码。
示例代码:
using System;class Program
{static void Main(){string baseUrl = "https://example.com/path?query=Hello World!";string additionalPath = "/new/path";// 使用Uri.EscapeUriString对路径进行编码string fullUrl = Uri.EscapeUriString(baseUrl + additionalPath);Console.WriteLine($"Full URL: {fullUrl}");}
}
输出:
Full URL: https://example.com/path?query=Hello%20World!/new/path
3. HttpUtility.UrlEncode 实战示例
场景:处理表单数据
在Web应用程序中,处理用户提交的表单数据时,通常需要将数据编码为application/x-www-form-urlencoded格式。HttpUtility.UrlEncode可以将空格转换为加号(+)并对其他字符进行百分号编码。
示例代码:
using System;
using System.Web;class Program
{static void Main(){string formData = "Name=John Doe&Message=Hello World! 你好,世界!";// 使用HttpUtility.UrlEncode对表单数据进行编码string encodedData = HttpUtility.UrlEncode(formData);Console.WriteLine($"Encoded Form Data: {encodedData}");}
}
输出:
Encoded Form Data: Name%3DJohn+Doe%26Message%3DHello+World%21+%E4%BD%A0%E5%A5%BD%EF%BC%8C%E4%B8%96%E7%95%8C%EF%BC%81
总结
通过这些实际的应用示例,你可以更清楚地理解如何在不同场景下使用Uri.EscapeDataString、Uri.EscapeUriString和HttpUtility.UrlEncode来处理URI和URL编码。这些方法在确保数据安全性和正确性的同时,能够帮助你生成有效的URI和URL。在处理实际项目时,选择合适的编码方法对于避免错误和确保应用程序的正常运行至关重要。
相关文章:
深入解析C#中的URI和URL编码:理解EscapeDataString、EscapeUriString和UrlEncode的区别及字符编码错误处理
在C#中,处理URI(统一资源标识符)和URL(统一资源定位符)时,可以使用Uri.EscapeDataString、Uri.EscapeUriString和HttpUtility.UrlEncode(或WebUtility.UrlEncode)方法来编码字符串。…...
【CSS】给图片设置 max-width
.logo img{width:100%; /* 缩成父盒子的100% */max-width:100%; /* (谁小用谁的百分之百) *//* max-width:100%;【1】图片比盒子大,缩成父盒子的100%【2】图片比盒子小,图片自身的100%*/ }示例 设置样式 .el-image {width: 100%;max-width: 100%;max-…...
区块链——代码格式检查(prettier、solhint)
一、引入依赖 // 导入prettier prettier-plugin-solidity yarn add --dev prettier prettier-plugin-solidity yarn add --dev solhint二、创建.prettierrc文件 {"tabWidth": 2,"semi": false,"useTabs": false,"singleQuote": fals…...
搭建自动化 Web 页面性能检测系统 —— 部署篇
作为一个前端想去做全栈的项目时,可能第一个思路是 node vue/react。一开始可能会新建多个工程目录去实现,假设分别为 web 和 server,也许还有管理后台的代码 admin,那么就有了三个工程的代码。此时为了方便管理就需要在远程仓库…...
知识图谱增强的RAG(KG-RAG)详细解析
转自:知识图谱科技 这是一个与任务无关的框架,它将知识图谱(KG)的显性知识与大型语言模型(LLM)的隐含知识结合起来。这是该工作的arXiv预印本 https://arxiv.org/abs/2311.17330 。 我们在这里利用一个名为…...
python中list的深拷贝和浅拷贝
其实这还是涉及到python中的可变对象和不可变对象的概念。 https://www.cnblogs.com/poloyy/p/15073168.html # -*- coding: utf-8 -*-person [name, [savings, 100.00]] hubby person[:] # slice copy wifey list(person) # fac func copy a [id(x) for x in person] b …...
【LeetCode】字母异位词分组
题目描述: 给你一个字符串数组,请你将字母异位词组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 输出: [[“bat”…...
Golang | Leetcode Golang题解之第295题数据流的中位数
题目: 题解: type MedianFinder struct {nums *redblacktree.Treetotal intleft, right iterator }func Constructor() MedianFinder {return MedianFinder{nums: redblacktree.NewWithIntComparator()} }func (mf *MedianFinder) AddNum(…...
【C语言】C语言期末突击/考研--数据的输入输出
目录 一、printf()输出函数介绍 二、scanf读取标准输入 (一)scanf函数的原理 (二)多种数据类型混合输入 三、练习题 今天我们学习printf和scanf读取标准输入。下面我们开始正式的学习吧。 C语言中有很多内置函数,今…...
How can I fix my Flask server‘s 405 error that includes OpenAi api?
题意:解决包含OpenAI API的Flask服务器中出现的405错误(Method Not Allowed,即方法不允许) 问题背景: Im trying to add an API to my webpage and have never used any Flask server before, I have never used Java…...
LeetCode Hot100 将有序数组转换为二叉搜索树
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。 示例 1: 输入:nums [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null,-3,null,9] 也将被视为正确…...
【Linux】线程的控制
目录 线程等待 线程退出 线程的优缺点 线程独占和共享的数据 我们说Linux是用进程模拟的线程,所以Linux中只有轻量级进程的概念,但是,用户是只认线程的,所以我们有一个叫原生线程库的东西,它就负责把轻量级进程的系…...
Vue3自研开源Tree组件:人性化的拖拽API设计
针对Element Plus Tree组件拖拽功能API用的麻烦,小卷开发了一个API使用简单的JuanTree组件。拖拽功能用起来非常简单! 文章目录 使用示例allowDragallowDrop支持节点勾选支持dirty检测后台API交互 源码实现 使用示例 组件的使用很简单: 通过…...
MYSQL--触发器详解
触发器 1.触发器简介 触发器(trigger)是一个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update…...
C++实用指南:Lambda 表达式的妙用
Lambda 表达式的灵活性和强大功能确实为编程提供了许多便利。但是我们发现许多开发者仍然无法灵活运用其便利,于是写了这篇文章。 Lambda 允许我们编写更简洁和灵活的代码。例如在处理网络请求时,我们经常需要确保响应与当前的状态或需求仍然相关。通过…...
FastAPI(七十八)实战开发《在线课程学习系统》接口开发-- 评论
源码见:"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 梳理下思路 1.判断是否登录 2.课程是否存在 3.如果是回复,查看回复是否存在 4.是否有权限 5.发起评论 首先新增pydantic模型 class Cour…...
基于springboot+vue+uniapp的居民健康监测小程序
开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…...
TypeScript基础【学习笔记】
一、TypeScript 开发环境搭建 下载并安装 Node.js使用 npm 全局安装 typescript 进入命令行输入:npm i -g typescript 创建一个 ts 文件使用 tsc 对 ts 文件进行编译 进入命令行进入 ts 文件所在目录执行命令:tsc xxx.ts 二、基本类型 类型声明 通过类型…...
树莓派物联网服务器搭建流程:集成 Node.js、InfluxDB、Grafana 和 MQTT 协议
目录 一、搭建准备 1. 硬件要求 2. 软件要求 二、技术栈概述 三、搭建步骤 1. 安装操作系统 2. 启动树莓派 3. 更新系统 4. 安装必要的软件 4.1 安装 Python 和 Flask 4.2 安装 Node.js 4.3 安装 Mosquitto(MQTT Broker) 4.4 安装 InfluxDB…...
typescript 断言
/* 断言 确定后期一定是某种格式 可用于表单大对象初始化是空,赋值时有具体字段。前期断言是会是某种格式 */interface obj {name: stringlocation: stringage?: number }// 会报错 // let data: obj { // // } let data: obj {} as obj; // 断言data会有obj里…...
LFM2.5-1.2B-Thinking部署教程:3步实现Python爬虫数据智能处理
LFM2.5-1.2B-Thinking部署教程:3步实现Python爬虫数据智能处理 1. 引言 你是不是经常遇到这样的问题:爬虫抓取了一大堆数据,但面对杂乱无章的文本内容却无从下手?手动整理不仅耗时耗力,还容易出错。现在,…...
面向对象编程入门(下篇):继承、封装与多态
在上篇中,我们学会了如何定义类和创建对象,将现实世界的事物用代码表示。今天,我们将深入面向对象编程的三大核心特性:继承、封装和多态。这些特性将让你的代码更加灵活、可扩展和易维护。一、继承:代码复用的“家族传…...
Qwen3-ASR-0.6B WebUI实战:中文方言自动识别与结果导出操作
Qwen3-ASR-0.6B WebUI实战:中文方言自动识别与结果导出操作 1. 快速了解Qwen3-ASR-0.6B语音识别模型 Qwen3-ASR-0.6B是一个轻量级但性能强大的语音识别模型,专门为实际应用场景设计。这个模型只有6亿参数,但识别效果却相当出色,…...
电力电子器件全解析:从二极管到IGBT,手把手教你掌握王兆安教材核心考点
电力电子器件深度解析:从基础原理到高效复习策略 电力电子技术作为现代自动化与能源转换的核心学科,其器件特性与应用的掌握程度直接影响着工程师解决实际问题的能力。对于华南理工大学自动化专业的学生而言,王兆安教授的《电力电子技术》教材…...
Keil5主题配色进阶:不只是好看,更要好用!详解如何区分函数、变量、宏定义的颜色
Keil5主题配色进阶:不只是好看,更要好用!详解如何区分函数、变量、宏定义的颜色 作为一名嵌入式开发者,每天面对Keil5的默认编辑器界面,你是否也感到视觉疲劳?那些单调的配色不仅影响编码心情,更…...
面向对象高级三:内部类 枚举 泛型 java.lang包下常用API
一.内部类1.内部类概述 2.成员内部类(实例内部类)(1)成员内部类可以定义类的一切成员(2)当创建对象时不能直接给内部类创建对象而要先创建外部类的对象 然后new成员内部类的对象(3)在…...
【CDA干货】三个部门三个营收数:1200 万、1150 万、1280 万?企业指标口径不一致,三步破局
财务部报的Q3营收是1200万,运营部那边却是1150万,更离谱的是CEO给投资人看的PPT上写着1280万。这种事儿听起来是不是很离谱?但实际上,数据对不上,这事儿太常见了。表面看是数字打架,实际上是人跟人较劲——…...
梦行云软件——溯源系统-》企业方》产品溯源管理》员工管理
梦行云软件——溯源系统-》企业方》产品溯源管理》员工管理 湖南梦辰软件开发有限公司是立足怀化、服务全国的数字化技术服务商。公司拥有19项软件著作权及多项自主知识产权。专注于Web系统、APP与小程序定制开发,提供全链路数字化解决方案。以合规先行与稳定交付为…...
OpenClaw技能扩展指南:为GLM-4.7-Flash添加自定义功能
OpenClaw技能扩展指南:为GLM-4.7-Flash添加自定义功能 1. 为什么需要自定义技能 去年冬天,当我第一次尝试用OpenClaw自动整理电脑上的照片时,发现现有的技能库无法满足我的特殊需求——按照拍摄地点和人物自动分类。这让我意识到࿰…...
Vue/React项目实战:集成docx-preview实现动态报表预览与下载功能
Vue/React项目实战:动态报表预览与下载的工程化实现 在数据驱动的企业应用中,动态生成和预览业务报表是刚需功能。想象这样一个场景:销售团队在CRM系统中筛选季度数据后,需要立即查看格式规范的业绩分析报告,并能一键…...
