在对接api时候,经常需要对字符串进行各种编码处理,系统可能是异构的,实现语言也就可能是不一样的。所以经常会使人犯一些2B的错误!

比如:php实现的api中用了rawurlencode,文档中写,需要对字符串进行urlencode编码,.net的开发人员看到文档,直接使用HttpUtitlity.UrlEncode,

   本以为问题已经解决,实际埋下了一个大坑!

  其实php的rawurlincode 实现的是RFC3986,.NET(c#)的HttpUtility.UrlEncode实现的并不是RFC3986!所以对同一个字符串编码当然可能产生不同的结果!

关键是这种问题,很难意识到并去解决!所以,以后遇到类似的问题,一定要记得:要面向协议思考、解决问题,否则...

  下面附上C#对RFC3986的实现:

   /// <summary>
/// Provides implementation of RFC3986 Percent Encoding mechanism.
/// </summary>
public class RFC3986Encoder
{
/// <summary>
/// Performs upper case percent encoding against the specified <paramref name="input"/>.
/// </summary>
/// <param name="input">The string to encode.</param>
/// <returns>Encode string.</returns>
public static string Encode(string input)
{
if (string.IsNullOrEmpty(input))
return input; StringBuilder newStr = new StringBuilder(); foreach (var item in input)
{
if (IsReverseChar(item))
{
newStr.Append("%");
var temp = ((int)item).ToString("X2");
newStr.Append(temp);
}
else
newStr.Append(item);
} return newStr.ToString();
} /// <summary>
/// Performs lower case percent encoding (url-encodes) on the <paramref name="input"/> as what HttpUtility.UrlEncode does.
/// </summary>
/// <param name="input">The string to encode.</param>
/// <returns>Encode string.</returns>
public static string UrlEncode(string input)
{
StringBuilder newBytes = new StringBuilder();
var urf8Bytes = Encoding.UTF8.GetBytes(input);
foreach (var item in urf8Bytes)
{
if (IsReverseChar((char)item))
{
newBytes.Append('%');
newBytes.Append(ByteToHex(item)); }
else
newBytes.Append((char)item);
} return newBytes.ToString();
} private static bool IsReverseChar(char c)
{
return !((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '' && c <= '')
|| c == '-' || c == '_' || c == '.' || c == '~');
} private static string ByteToHex(byte b)
{
return b.ToString("x2");
} private static readonly DateTime UnixEpoch = new DateTime(, , , , , , , ); /// <summary>
/// Gets the seconds from 1970/1/1.
/// </summary>
/// <param name="time">The time to calculate from.</param>
/// <returns>The seconds.</returns>
public static int ToUnixTime(DateTime time)
{
return (int)(time.ToUniversalTime() - UnixEpoch).TotalSeconds;
}
}

.net 中实现php rawurlencode方法(RFC3986)的更多相关文章

  1. JavaScript中Math对象的方法介绍

    1.比较最值方法 比较最值有两种方法,max() 和 min() 方法. 1.1 max() 方法,比较一组数值中的最大值,返回最大值. var maxnum = Math.max(12,6,43,5 ...

  2. Android中锁定文件的方法

    androidSDK中并没有锁定文件相关的api. 但是android是基于linux操作系统的,linux比较底层,灵活性也更大,为了实现锁定文件的效果,大概有以下几种办法: 用chmod命令修改文 ...

  3. jQuery中的事件绑定方法

    在jQuery中,事件绑定方法大致有四种:bind(),live(), delegate(),和on(). 那么在工作中应该如何选择呢?首先要了解四种方法的区别和各自的特点. 在了解这些之前,首先要知 ...

  4. Eclipse中自动提示的方法参数都是arg0,arg1的解决方法

    Eclipse中自动提示的方法参数都是arg0,arg1,就不能根据参数名来推断参数的含义,非常不方便. 解决方法:Preferences->Java->Installed JREs,发现 ...

  5. Power BI官方视频(2) Power BI嵌入到应用中的3种方法

    今天给大家介绍3种将Power BI嵌入到应用中的方法. 本文原文地址:Power BI官方视频(2) Power BI嵌入到应用中的3种方法 Power BI系列文章地址:微软Power BI技术文 ...

  6. JQuery中each()的使用方法说明

    JQuery中each()的使用方法说明 对于jQuery对象,只是把each方法简单的进行了委托:把jQuery对象作为第一个参数传递给jQuery的each方法.换句话说:jQuery提供的eac ...

  7. Dedecms去掉URL中a目录的方法

    本文实例讲述了Dedecms去掉URL中a目录的方法.分享给大家,供大家参考.具体分析如下: 使用dedecms的朋友可能会发现自己的URL目录生成是会自动带有一个/A/目录了,那么要如何去掉URL中 ...

  8. 【转】C#中WinForm程序退出方法技巧总结

    C#中WinForm程序退出方法技巧总结 一.关闭窗体 在c#中退出WinForm程序包括有很多方法,如:this.Close(); Application.Exit();Application.Ex ...

  9. inux中shell截取字符串方法总结

    shell中截取字符串的方法有很多中, ${expression}一共有9种使用方法. ${parameter:-word} ${parameter:=word} ${parameter:?word} ...

随机推荐

  1. 身份验证cookies和Token

    后端服务器有两种基本的身份验证:1.是基于Cookie的身份验证,使用服务器端的cookie来对每次请求的用户进行身份验证.2. 较新的方法,基于令牌Token的认证,依赖于被发送到服务器上每个请求的 ...

  2. [置顶] ※数据结构※→☆线性表结构(list)☆============单向链表结构(list single)(二)

    单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始:链表是使用指针进行构造的列表:又称为结点列表,因为链表是由一个个结点组装起来的:其中每个结点都有指 ...

  3. poj 1459 (最大流)

    最大流简单题,,这题重要的是知道了scanf("%s",str);sscanf(str,"(%d,%d)%d",&x,&y,&w);读入 ...

  4. 不允许在单例对象中创建Srping容器

    spring.net在使用的时候,不允许在单例对象中创建Srping容器 需要将实例化模式转为单例singleton=“false”

  5. 笔记-Node.js中的核心API之HTTP

    最近正在学习Node,在图书馆借了基本关于Node的书,同时在网上查阅资料,颇有收获,但是整体感觉对Node的理解还是停留在一个很模棱两可的状态.比如Node中的模块,平时练习就接触到那么几个,其他的 ...

  6. 简单的web三层架构系统【第三版】

    今天是第三版,和前几天一样今天还是要对代码进行优化,三层架构是一种思想,具体能不能使得整个系统安全和高性能,还是要看代码编写的是否合理,逻辑性是否严谨. 昨天偶然间看到别人写的三层架构中,竟然没有在方 ...

  7. Servlet 的基本架构

    import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpSer ...

  8. final, finally, finalize 的区别

    1.final 用于声明属性, 方法和类, 分别表示属性不可变, 方法不可覆盖, 类不可继承.内部类要访问局部变量, 局部变量必须定义成 final 类型, 例如, 一段代码…… 2.finally ...

  9. JavaSE学习总结第26天_网络编程

      26.01  网络编程概述 网络编程:就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换. 26.02  网络模型概述和图解 计算机网络之间以何种规则进行通信,就是网络模型研究问题. ...

  10. jquery回调函数callback的使用

    回调函数必须是全局函数或者静态函数,不可定义为某个特定的类的成员函数 callback函数在当前动画100%完成之后执行 $("p").hide(1000); alert(&quo ...