c#: UrlDecode()
1、源起:
KV需要解析从插件传来的URL网址,因为其可能经过编码,所以需要解码。
初用System.Web.HttpUtility.UrlDecode()这个函数,但根据用户环境crash场景,发现有.net framework库不全情况,即找不到System.Web.dll这个程序集。
居然有此等事情!
自写代码解析喽,在网上下载得System.Web源代码,抽离所需函数,满足需求,项目可以舍弃对System.Web的引用
2、UrlDecode(string str)
直贴代码以做备忘:
public static string UrlDecode(string str)
{
return UrlDecode(str, Encoding.UTF8);
} static void WriteCharBytes(IList buf, char ch, Encoding e)
{
if (ch > )
{
foreach (byte b in e.GetBytes(new char[] { ch }))
buf.Add(b);
}
else
buf.Add((byte)ch);
} static int GetInt(byte b)
{
char c = (char)b;
if (c >= '' && c <= '')
return c - ''; if (c >= 'a' && c <= 'f')
return c - 'a' + ; if (c >= 'A' && c <= 'F')
return c - 'A' + ; return -;
} static int GetChar(string str, int offset, int length)
{
int val = ;
int end = length + offset;
for (int i = offset; i < end; i++)
{
char c = str[i];
if (c > )
return -; int current = GetInt((byte)c);
if (current == -)
return -;
val = (val << ) + current;
} return val;
} static string UrlDecode(string s, Encoding e)
{
if (null == s)
return null; if (s.IndexOf('%') == - && s.IndexOf('+') == -)
return s; if (e == null)
e = Encoding.UTF8; long len = s.Length;
var bytes = new List<byte>();
int xchar;
char ch; for (int i = ; i < len; i++)
ch = s[i];
if (ch == '%' && i + < len && s[i + ] != '%')
{
if (s[i + ] == 'u' && i + < len)
{
// unicode hex sequence
xchar = GetChar(s, i + , );
if (xchar != -)
{
WriteCharBytes(bytes, (char)xchar, e);
i += ;
}
else
WriteCharBytes(bytes, '%', e);
}
else if ((xchar = GetChar(s, i + , )) != -)
{
WriteCharBytes(bytes, (char)xchar, e);
i += ;
}
else
{
WriteCharBytes(bytes, '%', e);
}
continue;
} if (ch == '+')
WriteCharBytes(bytes, ' ', e);
else
WriteCharBytes(bytes, ch, e);
} byte[] buf = bytes.ToArray();
bytes = null;
return e.GetString(buf);
}
3、简单验证
string url = "https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DLeghS9MH9xY";
url = UrlDecode(url);
Console.WriteLine(url); //url = https://www.youtube.com/watch?v=LeghS9MH9xY
c#: UrlDecode()的更多相关文章
- C++ URLDecode和URLEncode实现——仅限gb2312,非utf8
转载--http://blog.163.com/zhangjie_0303/blog/static/9908270620148251658993/ #include <iostream> ...
- Python 中的urlencode和urldecode
python中的urlencode与urldecode 发表于2013/11/13 16:04:09 79983人阅读 分类: python 当url地址含有中文,或者参数有中文的时候,这个算是很正 ...
- c# UrlEncode,UrlDecode
用 C# winform 处理 utf-8,gb2312编码转换方法 首先,在项目属性 的 应用程序——目标框架中,选择 .NET Framework 4 然后再添加引用——.NET 中选择 ...
- HttpUtility.UrlDecode
如果在 HTTP 流中传递如空格或者标点符号等字符,它们可能会错误地解释在接收端. URL 编码转换为字符实体等效项; 不允许在 URL 中的字符URL 解码反转的编码. 例如,在嵌入到要在 URL ...
- php中urldecode()和urlencode()
urlencode()函数原理就是首先把中文字符转换为十六进制,然后在每个字符前面加一个标识符%.urldecode()函数与urlencode()函数原理相反,用于解码已编码的 URL 字符串,其原 ...
- 关于URLEnCode,URLDeCode,Base64,公钥私钥
1.Base64非常适合http.mime协议,所以在一些类似webservice中可以用Base64. 用法如下:传出去之前先 Convert.ToBase64String(encryptedByt ...
- urldecode解码方法
输入为带有urldecode转码文本,输出正常文本. //20130625 by zhangyl private string ConvertToString(string input) { inpu ...
- Server.UrlEncode与Server.UrlDecode(url传递中文的解决方案)
1.设置web.config文件.<system.web> ...... <globalization requestEncoding="gb2312" resp ...
- python(24)urlencode和urldecode
当url地址含有中文,或者参数有中文的时候,这个算是很难正常了,但是把这样的url作为参数传递的时候(最常见的callback),需要把一些中文甚至‘/’做一下编码转换. 一.urlencode ur ...
- URLEncode与URLDecode总结与实现
URLEncode: 用于编码URL字符串,数字和字母保持不变,空格变为'+',其他(如:中文字符)先转换为十六进制表示,然后在每个字节前面加一个标识符%,例如:“啊”字 Ascii的十六进制是0xB ...
随机推荐
- python 之列表推导式,集合推导式,以及字典推导式
https://www.cnblogs.com/weihengblog/p/8428124.html
- vue-x action 的相互调用
实现方式:分发 Action Action 通过 store.dispatch 方法触发: store.dispatch('increment')
- python 读取文件
python 一次读取多行 with open(filename, "r") as f: lines = f.readlines(LINE_BATCH) while lines: ...
- layer.js 学习笔记
了解到一个很好用的弹框插件,名字叫layer.js 前几天要在网页中改写alert函数,自己写了一个模态框,虽然效果出来了,但是点击关闭后,无法返回当前页面.请教大神时,说有一个叫layer.js的东 ...
- docker之数据卷管理
转自:https://www.cnblogs.com/jsonhc/p/7777811.html docker之数据卷的备份和还原 1.现在利用镜像创建一个nginx的服务容器,并挂载一个数据卷 [r ...
- datasnap服务器支持的参数类型
可作为参数的类型TDBXWideStringValueTDBXAnsiStringValueTDBXInt16ValueTDBXInt32ValueTDBXInt64ValueTDBXSingleVa ...
- 命名空间与use
以下是自己读PHP手册命名空间这一节的一些笔记,还有自己上机做命名空间测试的一些整理,原创博客,有错欢迎指正: 1.命名空间声明必须是第一条语句,若没有声明命名空间的脚本,则被认为是全局空间的脚本.若 ...
- Linux命令:history
显示历史(执行过的)命令. history [n] history -c history -d offset history -anrw [filename] history -p arg [arg ...
- 使用mysqlbinlog恢复指定表
从整库备份的sql文件中导出某个表的sql语句时,vim查找到表的第一条INSERT语句后,按上下换行键计数INSERT语句的条数,然后按n yy复制,退出vim后,再新建一个文件,按p粘贴刚才的n条 ...
- mycat 多个逻辑库加读写分离
上3篇笔记主要记录了,读写分离,单库分表,分库分表 这次改动了下,实现了分库分表以及读写分离,基于多个逻辑库,先看配置文件 server.xml <user name="root&qu ...