C# HTML UNICODE 轉換,當擷取網頁資料遇上【&#XXXX;】的解決方案。

  • 2540
  • 0
  • C#
  • 2015-06-09

一般我們在撰寫程式,有時會需要擷取網頁上的標籤(HTML TAG),但是有些網站的編碼方式是用HTML UNICODE來編碼的,雖然網頁上是正常的顯示,但當我們檢視原始碼時看到的卻是【因為氣候異常】,突然覺得世界要毀滅了,但是各位客官不用擔心,我們只要將HTML UNICODE轉換回人類看得懂的文字就好了 ! !

本篇文章將引導您將HTML UNICODE 轉換回人類看得懂的文字 ! !

一般我們在撰寫程式,有時會需要擷取網頁上的標籤(HTML TAG),但是有些網站的編碼方式是用HTML UNICODE來編碼的,雖然網頁上是正常的顯示,但當我們檢視原始碼時看到的卻是【因為氣候異常】,突然覺得世界要毀滅了,但是各位客官不用擔心,我們只要將HTML UNICODE轉換回人類看得懂的文字就好了 ! !

 

本篇文章將引導您將HTML UNICODE 轉換回人類看得懂的文字 ! !

 

HTML UNICODE 編碼顧名思義是使用UNICODE 也就是萬國碼來編製的,所謂萬國碼如字面上意思解釋,包含各國語言之編碼方式,所以透過UNICODE來編碼的好處是涵括各國語言在其他語系的作業系統上瀏覽網頁不會出現亂碼的情形,缺點是占用的位元數也較多,網頁的容量也較大,因為UNIICODE每個字占用2位元組也就是16bit。

 

在HTML UNICODE中每一個字的組成方式為【&#XXXX;】,【&#】為開始【;】為結束,中間的【XXXX】代表著每一個字符的代碼,

所以我們在檢視網頁原始檔時有時會遇見【因為氣候異常】的情況,那我們只要將代碼轉換回文字就可以了,網路上有許多方法可以利用【System.Net.WebUtility.HtmlDecode()】來達成,但是經SUKI實際測試完全沒有效果,可能是因為SUKI截取回來的代碼已經被轉換為【字串】了,所以我們可以透過【Convert.ToChar(Convert.ToInt32(XXXX))】來完成,但實際上網頁解析字串並不是這麼地順利,因為遇到了英文和阿拉伯數字會正常顯示而其他語系或特殊符號是顯示【&#XXXX;】,特殊的情況就要用特殊的方法來解決,所以SUKI專研許久終於寫出了以下的程式碼分享在此,此程式碼不適用於整個包含TAG的HTML,僅適用於所有文字組成為【英文】、【阿拉伯數字】、【&#XXXX;】三種組合才可以,若有其他大大有更好的程式碼也歡迎在此分享給各位。

 

   1:  private string Unicode2HTML(string unc)
   2:  {
   3:      StringBuilder sb = new StringBuilder();
   4:      //以;將文字拆成陣列
   5:      string[] tmp = unc.Split(';');
   6:      //檢查最後一個字元是否為【;】,因為有【英文】、【阿拉伯數字】、【&#XXXX;】
   7:      //若最後一個要處理的字並非HTML UNICODE則不進行處理
   8:      bool Process_last = unc.Substring(unc.Length - 1, 1).Equals(";");
   9:      //Debug.WriteLine(tmp.Length + "");
  10:      for (int i = 0; i < tmp.Length; i++)
  11:      {
  12:          //以&#將文字拆成陣列
  13:          string[] tmp2 = tmp[i].Split(new string[] { "&#" }, StringSplitOptions.RemoveEmptyEntries);
  14:          if (tmp2.Length == 1)
  15:          {
  16:              //如果長度為1則試圖轉換UNICODE回字符,若失敗則使用原本的字元
  17:              if (i != tmp.Length - 1)
  18:              {
  19:                  try
  20:                  {
  21:                      sb.Append(Convert.ToChar(Convert.ToInt32(int.Parse(tmp2[0]))).ToString());
  22:                  }
  23:                  catch
  24:                  {
  25:                      sb.Append(tmp2[0]);
  26:                  }
  27:              }
  28:              else
  29:              {
  30:                  sb.Append(tmp2[0]);
  31:              }
  32:          }
  33:          if (tmp2.Length == 2)
  34:          {
  35:              //若長度為2,則第一項不處理,只處理第二項即可
  36:              sb.Append(tmp2[0]);
  37:              sb.Append(Convert.ToChar(Convert.ToInt32(int.Parse(tmp2[1]))).ToString());
  38:          }
  39:      }
  40:   
  41:   
  42:      return sb.ToString();
  43:  }

 

如此一來就學會了將HTML UNICODE 轉換回人類看得懂的文字了 ! !

 

Refrences : Wiki unicode

文章中的敘述如有觀念不正確錯誤的部分,歡迎告知指正 謝謝
轉載請註明出處,並且附上本篇文章網址 !  感謝。

SUKI

HOLIESTAR