程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> asp.net2統一搜索引擎關鍵字編碼

asp.net2統一搜索引擎關鍵字編碼

編輯:關於ASP.NET

View二期開發正式啟動,一開始就碰到了麻煩事,因為在統計模塊中,需要得到來源搜索鏈接的關鍵字,所以一開始就用正則把關鍵字部分匹配出來,然後用自帶的 Uri.UnescapeDataString() 將Urlcoding轉換為文字。

本來一切都很順利,結果將百度,網易搜索加到規則裡面,就開始報錯了。我猜想可能是和編碼有關系,因為Google一向都是UTF-8,國內的網站大多偏向使用GB2312,所以出現這個問題我還不是很擔心。

哪裡知道,這個問題的嚴重性,讓我差點對程序算法的研究失去信心。因為今天聽到有個人說我膽子好大,居然敢把所有鏈接的事件給改掉了,萬一還有相同事件,那麼就會出嚴重的問題。我一向認為我還是個比較心細的人,在我做那件大膽的事情前,我是仔細地咨詢過有沒有相同事件存在,在得到肯定的答復後,我才開始做的。代碼雖然不多,但是我敢說裡面能考慮到的,不能考慮到的錯誤,我基本已經都做到。

回到正題,在網上一搜索,發現asp.net這方面的資料真的是太少了,然後看了看ASP和PHP的,發現做法十分復雜,而且還容易出錯,甚至還要建一個gb2312到utf-8的編碼對照表。

我堅信微軟一定會給出一個完美的解決方案,於是開始查MSDN,從Encoding入手,發現存在轉換編碼的方法。但是問題又出現了,因為我得到的是URL形式的字符串,現在還不知道這個字符串是屬於utf-8的,還是gb2312的,所以不能使用UnescapeDataString轉換成文字後再進行轉碼,因為這樣馬上會報錯。

於是開始分析gb2312和utf-8的編碼原理,發現他們在.net裡是存在關聯性的,一個是2位編碼,一個是三位編碼,於是我試者將gb2312的編碼進行分解,將每2位作為2個16進制的byte類型放入一個byte數組裡面,然後通過正常的轉碼方式轉為utf-8的byte類型,然後放入char裡面,最後轉成正常文字。

結果馬上就揭曉了,居然成功了,然後再接再厲,寫了一個搜索引擎類型判斷的方法,於是一切就這麼給解決。

下面給出代碼,希望可以幫到有用的朋友:

程序代碼

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text.RegularExpressions;
using System.Text;
/// <summary>
/// 搜索引擎處理
/// </summary>
public class ExJudgeSystem
{
   public ExJudgeSystem()
   {
   }
   #region 初始化變量
   //搜索引擎特征
   private string[][] _Enginers = new string[][] {
     new string[]{"google","utf8","q"},
     new string[]{"baidu","gb2312","wd"},
     new string[]{"yahoo","utf8","p"},
     new string[]{"yisou","utf8","search"},
     new string[]{"live","utf8","q"},
     new string[]{"tom","gb2312","word"},
     new string[]{"163","gb2312","q"},
     new string[]{"iask","gb2312","k"},
     new string[]{"soso","gb2312","w"},
     new string[]{"sogou","gb2312","query"},
     new string[]{"zhongsou","gb2312","w"},
     new string[]{"3721","gb2312","p"},
     new string[]{"openfind","utf8","q"},
     new string[]{"alltheweb","utf8","q"},
     new string[]{"lycos","utf8","query"},
     new string[]{"onseek","utf8","q"}
   };
   //搜索引擎名稱
   private string _EngineName = "";
   public string EngineName
   {
     get
     {
       return _EngineName;
     }
   }
   //搜索引擎編碼
   private string _Coding = "utf8";
   public string Coding
   {
     get
     {
       return _Coding;
     }
   }
   //搜索引擎關鍵字查詢參數名稱
   private string _RegexWord = "";
   public string RegexWord
   {
     get
     {
       return _RegexWord;
     }
   }
   private string _Regex = @"(";
#endregion
   #region 搜索引擎關鍵字
   //建立搜索關鍵字正則表達式
   public void EngineRegEx(string myString)
   {
     for (int i = 0, j = _Enginers.Length; i < j; i++)
     {
       if (myString.Contains(_Enginers[i][0]))
       {
         _EngineName = _Enginers[i][0];
         _Coding = _Enginers[i][1];
         _RegexWord = _Enginers[i][2];
         _Regex += _EngineName + @"\.+.*[?/&]" + _RegexWord + @"[=:])(?<key>[^&]*)";
         break;
       }
     }
   }
   //得到搜索引擎關鍵字
   public string SearchKey(string myString)
   {
     EngineRegEx(myString.ToLower());
     if (_EngineName != "")
     {
       Regex myReg = new Regex(_Regex, RegexOptions.IgnoreCase);
       Match matche = myReg.Match(myString);
       myString = matche.Groups["key"].Value;
       //去處表示為空格的+
       myString = myString.Replace("+", " ");
       if (_Coding == "gb2312")
       {
         myString = GetUTF8String(myString);
       }
       else
       {
         myString = Uri.UnescapeDataString(myString);
       }
     }
     return myString;
   }
   //整句轉碼
   public string GetUTF8String(string myString)
   {
     Regex myReg = new Regex("(?<key>%..%..)", RegexOptions.IgnoreCase);
     MatchCollection matches = myReg.Matches(myString);
     string myWord;
     for (int i = 0, j = matches.Count; i < j; i++)
     {
       myWord = matches[i].Groups["key"].Value.ToString();
       myString = myString.Replace(myWord, GB2312ToUTF8(myWord));
     }
     return myString;
   }
   //單字GB2312轉UTF8 URL編碼
   public string GB2312ToUTF8(string myString)
   {
     string[] myWord = myString.Split('%');
     byte[] myByte = new byte[] { Convert.ToByte(myWord[1], 16), Convert.ToByte(myWord[2], 16) };
     Encoding GB = Encoding.GetEncoding("GB2312");
     Encoding U8 = Encoding.UTF8;
     myByte = Encoding.Convert(GB, U8, myByte);
     char[] Chars = new char[U8.GetCharCount(myByte, 0, myByte.Length)];
     U8.GetChars(myByte, 0, myByte.Length, Chars, 0);
     return new string(Chars);
   }
   #endregion
   //判斷否為搜索引擎爬蟲,並返回其類型
   public string isCrawler(string SystemInfo)
   {
     string[] BotList = new string[] { "Google", "Baidu", "MSN", "Yahoo", "TMCrawler", "iask", "Sogou" };
     foreach (string Bot in BotList)
     {
       if (SystemInfo.ToLower().Contains(Bot.ToLower()))
       {
         return Bot;
       }
     }
     return "null";
   }
}

下午下班的時候,在出地鐵的時候撿到一個錢包,打開看了一下有幾百塊,嘿嘿!心癢癢的,不過小學老師就教導我們拾金不昧,我在站口傻站了半天,等掉錢包的人回來領,沒有結果,只好把錢包交給地鐵的工作人員。社會的素質文明是需要從每個人開始做起,而不是每天說些華而不實的廢話。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved