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()的更多相关文章

  1. C++ URLDecode和URLEncode实现——仅限gb2312,非utf8

    转载--http://blog.163.com/zhangjie_0303/blog/static/9908270620148251658993/   #include <iostream> ...

  2. Python 中的urlencode和urldecode

    python中的urlencode与urldecode 发表于2013/11/13 16:04:09  79983人阅读 分类: python 当url地址含有中文,或者参数有中文的时候,这个算是很正 ...

  3. c# UrlEncode,UrlDecode

    用 C#  winform  处理 utf-8,gb2312编码转换方法 首先,在项目属性 的  应用程序——目标框架中,选择 .NET Framework 4 然后再添加引用——.NET 中选择  ...

  4. HttpUtility.UrlDecode

    如果在 HTTP 流中传递如空格或者标点符号等字符,它们可能会错误地解释在接收端. URL 编码转换为字符实体等效项; 不允许在 URL 中的字符URL 解码反转的编码. 例如,在嵌入到要在 URL ...

  5. php中urldecode()和urlencode()

    urlencode()函数原理就是首先把中文字符转换为十六进制,然后在每个字符前面加一个标识符%.urldecode()函数与urlencode()函数原理相反,用于解码已编码的 URL 字符串,其原 ...

  6. 关于URLEnCode,URLDeCode,Base64,公钥私钥

    1.Base64非常适合http.mime协议,所以在一些类似webservice中可以用Base64. 用法如下:传出去之前先 Convert.ToBase64String(encryptedByt ...

  7. urldecode解码方法

    输入为带有urldecode转码文本,输出正常文本. //20130625 by zhangyl private string ConvertToString(string input) { inpu ...

  8. Server.UrlEncode与Server.UrlDecode(url传递中文的解决方案)

    1.设置web.config文件.<system.web> ...... <globalization requestEncoding="gb2312" resp ...

  9. python(24)urlencode和urldecode

    当url地址含有中文,或者参数有中文的时候,这个算是很难正常了,但是把这样的url作为参数传递的时候(最常见的callback),需要把一些中文甚至‘/’做一下编码转换. 一.urlencode ur ...

  10. URLEncode与URLDecode总结与实现

    URLEncode: 用于编码URL字符串,数字和字母保持不变,空格变为'+',其他(如:中文字符)先转换为十六进制表示,然后在每个字节前面加一个标识符%,例如:“啊”字 Ascii的十六进制是0xB ...

随机推荐

  1. ---github git clone 加速

    https://www.zhihu.com/question/27159393/answer/35528173 git config --global http.postBuffer 52428800 ...

  2. Redis脚本

    8.启动 /usr/local/bin/redis-server /etc/redis/redis.conf ./redis-server /home/work/redis/redis.conf &a ...

  3. 红警2在Y460和win10下运行

    1.将电源模式改为高性能模式 2.以WinXP兼容模式运行 3.修改RA2.ini文件 在[Video]下加入以下代码 : AllowHiResModes=yes VideoBackBuffer=no ...

  4. it工程师常用英文自我介绍常用用语

      Good morning ! It is really my honor to have this opportunity for an interview, I hope i can make ...

  5. C# 图像处理:实现鼠标选择矩形截图

    使用方法如下: private void button1_Click(object sender, EventArgs e) { s.GerScreenFormRectangle(); } priva ...

  6. Running Your Application

    在运行你的第一个app前,您先要了解以下文件: 1.AndroidManifest.xml:Android的基本配置信息: <uses-sdk> element:app兼容版本信息: ex ...

  7. hdu3579-Hello Kiki-(扩展欧几里得定理+中国剩余定理)

    Hello Kiki Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  8. python安装与IO编程

    <python爬虫开发与项目实战>基础篇(一) 一.python安装 1.python IDLE 下载官网:www.python.org 注:在选择安装组件时勾选所有组件,特别注意勾选pi ...

  9. .html() 与.text() 获取值、取值 区别

    1.html代码<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...

  10. Springboot 静态资源

    说下默认映射的文件夹有: classpath:/META-INF/resources classpath:/resources classpath:/static classpath:/public ...