using System;using System.Collections;using System.Configuration;using System.Data;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.HtmlControls;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Text;using System.Text.RegularExpressions;
/// 调用 //
string referer = RefererDecode("网址"); Response.Write(referer); Response.Write("<br /><a href='"); Response.Write(referer); Response.Write("'>点击查看</a>"); Response.End();
/
public string RefererDecode(string url)//来路解密,适用于baidu,google...调用这个就行 { if (string.IsNullOrEmpty(url)) { return ""; } url = UrlDecode(url); url = url.Trim();
if (url.Substring(0, 4) == "http:") { return url; } int idx = url.IndexOf("http:"); if (idx == -1) { return url; }
string s = url.Substring(idx, url.Length - idx); s += "&" + url.Substring(0, idx);
if (s.Substring(s.Length - 1, 1) == "&") { s = s.Substring(0, s.Length - 1); } return s; }
private string UrlDecode(string url) { string result = ""; byte[] buf = GetUrlCodingToBytes(url); if (IsUTF8(buf)) { result = HttpUtility.UrlDecode(url, Encoding.UTF8); } else { result = HttpUtility.UrlDecode(url, Encoding.GetEncoding("GB2312")); } return result; }
private byte[] GetUrlCodingToBytes(string url) { StringBuilder sb = new StringBuilder(); int i = url.IndexOf('%'); while (i >= 0) { if (url.Length < i + 3) { break; } sb.Append(url.Substring(i, 3)); url = url.Substring(i + 3); i = url.IndexOf('%'); }
string urlCoding = sb.ToString(); if (string.IsNullOrEmpty(urlCoding)) return new byte[0];
urlCoding = urlCoding.Replace("%", string.Empty); int len = urlCoding.Length / 2; byte[] result = new byte[len]; len *= 2; for (int index = 0; index < len; index++) { string s = urlCoding.Substring(index, 2); int b = int.Parse(s, System.Globalization.NumberStyles.HexNumber); result[index / 2] = (byte)b; index++; } return result; }
private bool IsUTF8(byte[] buf) { int i; byte cOctets; bool bAllAscii = true; long iLen = buf.Length; cOctets = 0; for (i = 0; i < iLen; i++) { if ((buf[i] & 0x80) != 0) bAllAscii = false;
if (cOctets == 0) { if (buf[i] >= 0x80) { do { buf[i] <<= 1; cOctets++; } while ((buf[i] & 0x80) != 0); cOctets--; if (cOctets == 0) return false; } } else { if ((buf[i] & 0xC0) != 0x80) return false; cOctets--; }
} if (cOctets > 0) return false; if (bAllAscii) return false; return true; }