.net 中实现php rawurlencode方法(RFC3986)
2013-09-29 17:26
197 查看
在对接api时候,经常需要对字符串进行各种编码处理,系统可能是异构的,实现语言也就可能是不一样的。所以经常会使人犯一些2B的错误!
比如:php实现的api中用了rawurlencode,文档中写,需要对字符串进行urlencode编码,.net的开发人员看到文档,直接使用HttpUtitlity.UrlEncode,
本以为问题已经解决,实际埋下了一个大坑!
其实php的rawurlincode 实现的是RFC3986,.NET(c#)的HttpUtility.UrlEncode实现的并不是RFC3986!所以对同一个字符串编码当然可能产生不同的结果!
关键是这种问题,很难意识到并去解决!所以,以后遇到类似的问题,一定要记得:要面向协议思考、解决问题,否则...
下面附上C#对RFC3986的实现:
比如: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 >= '0' && c <= '9') || c == '-' || c == '_' || c == '.' || c == '~'); } private static string ByteToHex(byte b) { return b.ToString("x2"); } private static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, 0); /// <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; } }
相关文章推荐
- PHP和.net中des加解密的实现方法
- PHP和.net中des加解密的实现方法
- 我的模板分析引擎类PHP的.net开发方法--功能实现篇
- .net 3.0+关于实现IEnumerable的类型的扩展方法的使用一
- smarty实现PHP静态化的两种方法分享
- 实现网页页面跳转的几种方法(meta标签、js实现、php实现)
- 网站页面自动跳转实现方法PHP、JSP(上)
- PHP实现抓取迅雷VIP账号的方法
- popen实现PHP并发方法
- PHP实现懒加载的方法
- php与ajax交互——实现php实时返回结果给ajax,并在后台保持继续运行的方法
- .net中实现阳历转阴历的方法
- PHP巧妙利用位运算实现网站权限管理的方法
- php实现和c#一致的DES加密解密 (php中调用方法)
- PHP调用静态方法实例化自己实现链式编程
- php实现连接access数据库并转txt写入的方法
- PHP实现根据时间戳获取周几的方法
- PHP简单实现遍历目录下特定文件的方法小结
- php实现字符串翻转的方法